/*
 * Think Online Web Desktop/Think Desktop scripts; portion Mike Hall of Brainjar.com
 * Copyright (C) 2009 Andy Tsai 薒昭安

 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.

 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.

 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.

 * Use of it must include this notice and acknowledgement of derivative work
 * Dedicated to the one that has my heart.
 * last change ver. 2009-1021
 */
var all_win = new Array();
var all_slave = new Array();
var all_sticky = new Array();
var win_template = null;
var res_obj = new Object();
var browser = new Browser();
res_obj.zIndex = 0;
var magic = new Array();
/*
MAGIC LIST
magic['max_top']
magic['max_left']
magic['max_right']
magic['max_bottom']
magic['bg_lighter']
magic['bg_alpha']
magic['bg_colour']
magic['titlebar_offset_right']
magic['get_titlebar']
magic['template_fix']
*/

// Internet Explorer workaround
magic['ie_offset_y']=0
magic['ie_offset_x']=0
if (browser.isIE) {
	alert('Internet Explorer is based on outdated Microsoft engine\nYou will not be able to enjoy full transparency effects and visual anomallies specific to Internet Explorer\nPlease upgrade to alternatives such as Firefox/Chrome/Safari soon');
magic['ie_offset_x']=10;
magic['ie_offset_y']=4;
}
var xcoord = 80;
var ycoord = 80;
function show_win_by_paneid(pid,ttxt,s) {
if (all_win[pid]) restore_win(all_win[pid]);
else {
	all_win[pid] = new_win(win_template,pid, ttxt, s);
	all_win[pid].style.left = xcoord + 'px';
	all_win[pid].style.top = ycoord + 'px';
	xcoord += 80;
	ycoord += 80;
	if (xcoord == 320) xcoord -= 240;
	if (ycoord == 320) ycoord -= 240;
}
return all_win[pid];
}

function resize_start(event, win, direction) {
  var el, x, y;

  res_obj.dir = direction;
  if (win) res_obj.elNode = win;
  else {
    if (browser.isIE || browser.isOP) res_obj.elNode = window.event.srcElement;
    if (browser.isNS) res_obj.elNode = event.target;

    if (res_obj.elNode.nodeType == 3) // 3 == Node.TEXT_NODE
      res_obj.elNode = res_obj.elNode.parentNode;
  }
  if (browser.isIE || browser.isOP) {
    x= window.event.clientX+document.documentElement.scrollLeft+document.body.scrollLeft;
    y= window.event.clientY+document.documentElement.scrollTop+document.body.scrollTop;
	if (window.event.altKey == true) {
		dragStart(event, win);
		return;
	}
  }
  if (browser.isNS) {
    x= event.clientX+window.scrollX;
    y= event.clientY+window.scrollY;
	if (event.altKey == true) {
		dragStart(event, win);
		return;
	}
  }
  res_obj.cursorStartX = x;
  res_obj.cursorStartY = y;
  res_obj.offset_left = parseInt(res_obj.elNode.style.left)-parseInt(x);
  res_obj.offset_top = parseInt(res_obj.elNode.style.top)-parseInt(y);
  res_obj.el_width  = parseInt(res_obj.elNode.style.width);
  res_obj.el_height = parseInt(res_obj.elNode.style.height);
  if (isNaN(res_obj.el_width)) res_obj.el_width = 530;
  if (isNaN(res_obj.el_height)) res_obj.el_height = 260;

  try {
	if (browser.isIE) {
		try {
			var maybe=(get_content_pane(res_obj.elNode)).getElementsByTagName('iframe');
			maybe[0].style.visibility='hidden';
		} catch (e) {;}
	}
  } catch (e) {alert(e);}
for (var x in all_win) {
	try {
		var maybe=(get_content_pane(all_win[x])).getElementsByTagName('div');
		for (var i in maybe) {
			if (maybe[i].className=='cover' && all_win[x].style.visibility=='visible') {
			maybe[i].style.visibility='visible';
			}
		}
	} catch (e) {;}
}
  if (browser.isIE || browser.isOP) {
    document.attachEvent("onmousemove", resize_go);
    document.attachEvent("onmouseup",   resize_done);
    window.event.cancelBubble = true;
    window.event.returnValue = false;
  }
  if (browser.isNS) {
    document.addEventListener("mousemove", resize_go,   true);
    document.addEventListener("mouseup",   resize_done, true);
    event.preventDefault();
  }
}
function resize_go(event) {
  var x, y;

  if (browser.isIE || browser.isOP) {
    x = window.event.clientX + document.documentElement.scrollLeft + document.body.scrollLeft;
    y = window.event.clientY + document.documentElement.scrollTop + document.body.scrollTop;
  }
  if (browser.isNS) {
    x = event.clientX + window.scrollX;
    y = event.clientY + window.scrollY;
  }

  if (res_obj.dir && res_obj.dir == 'se') {
	  res_obj.elNode.style.width = (res_obj.el_width + x - res_obj.cursorStartX) + "px";
    res_obj.elNode.style.height = (res_obj.el_height + y - res_obj.cursorStartY) + "px";
  } else if (res_obj.dir == 'sw') {
    res_obj.elNode.style.height = (res_obj.el_height + y - res_obj.cursorStartY) + "px";
    res_obj.elNode.style.width = (res_obj.el_width + (res_obj.cursorStartX- x)) + "px";
    res_obj.elNode.style.left = (x+res_obj.offset_left)+'px';
  } else if (res_obj.dir == 'e') {
    res_obj.elNode.style.width = (res_obj.el_width - (res_obj.cursorStartX- x)) + "px";
  } else if (res_obj.dir == 'w') {
    res_obj.elNode.style.left= (x+res_obj.offset_left)+"px";
    res_obj.elNode.style.width = res_obj.el_width+(res_obj.cursorStartX-x)+"px";
  } else if (res_obj.dir == 'n') {
    res_obj.elNode.style.top= (y+res_obj.offset_top)+"px";
    res_obj.elNode.style.height = res_obj.el_height+(res_obj.cursorStartY-y)+"px";
  } else if (res_obj.dir == 'nw') {
    res_obj.elNode.style.top= (y+res_obj.offset_top)+"px";
    res_obj.elNode.style.height = res_obj.el_height+(res_obj.cursorStartY-y)+"px";
    res_obj.elNode.style.left= (x+res_obj.offset_left)+"px";
    res_obj.elNode.style.width = res_obj.el_width+(res_obj.cursorStartX-x)+"px";
  } else if (res_obj.dir == 'ne') {
    res_obj.elNode.style.top= (y+res_obj.offset_top)+"px";
    res_obj.elNode.style.height = res_obj.el_height+(res_obj.cursorStartY-y)+"px";
    res_obj.elNode.style.width = (res_obj.el_width-(res_obj.cursorStartX-x))+"px";
  } else if (res_obj.dir == 's') {
    res_obj.elNode.style.height = (res_obj.el_height + y - res_obj.cursorStartY) + "px";
  }

redraw_win(res_obj.elNode,'reg');
  if (browser.isIE || browser.isOP) {
    window.event.cancelBubble = true;
    window.event.returnValue = false;
  }
  if (browser.isNS)
    event.preventDefault();
}

function resize_done(event) {
    for (var x in all_win) {
  try {
	if (browser.isIE) {
		var iframe=(get_content_pane(all_win[x])).getElementsByTagName('iframe');
		if (all_win[x]==res_obj.elNode) 
		  iframe[0].style.visibility='inherit';//visible';
		else iframe[0].style.visibility='hidden';
	}
	var maybe=(get_content_pane(all_win[x])).getElementsByTagName('div');
    for (var i in maybe) {
	  if (String(maybe[i].className)=='cover') {
        if (all_win[x]==res_obj.elNode)
		  maybe[i].style.visibility='hidden';
	    else if (all_win[x].style.visibility=='visible') maybe[i].style.visibility='visible';
      }
    }
  } catch (e) {;}
    }
      var maybe=(get_content_pane(res_obj.elNode)).getElementsByTagName('div');
      for (var i in maybe) {
	    if (String(maybe[i].className)=='cover') {
          maybe[i].style.visibility='hidden';
        }
      }
  if (browser.isIE || browser.isOP) {
    document.detachEvent("onmousemove", resize_go);
    document.detachEvent("onmouseup", resize_done);
  }
  if (browser.isNS) {
    document.removeEventListener("mousemove", resize_go, true);
    document.removeEventListener("mouseup", resize_done, true);
  }
}
// Start count as original hard coded window is 1
var no_windows = 1;
function focus_win(win, stop) {
	try {
		focus_win(document.getElementById(win.getAttribute('master')));
		return;
	} catch (e) {;}
var new_zi = 0;
for (var x in all_win) {
  all_win[x].className='window backwin';
  get_content_pane(all_win[x]).onmousedown=new Function("event", "focus_win(this.parentNode);");
  var maybe=(get_content_pane(all_win[x])).getElementsByTagName('div');
	if (browser.isIE) {
		try {
			var iframe=(get_content_pane(all_win[x])).getElementsByTagName('iframe');
			iframe[0].style.visibility='hidden';
		} catch (e) {;}
	}
  for (var i in maybe) {
	if (String(maybe[i].className)=='cover' && all_win[x].style.visibility=='visible') {
      maybe[i].style.visibility='visible';
    }
  }
  var zi = parseInt(all_win[x].style.zIndex);
  if (zi > new_zi) new_zi = zi;
}
win.className='window';
	if (browser.isIE) {
	  var maybe=(get_content_pane(win)).getElementsByTagName('iframe');
	  try {
		  maybe[0].style.visibility='visible';
	  } catch (e) {;}
	}
  var maybe=(get_content_pane(win)).getElementsByTagName('div');
  for (var i in maybe) {
	if (String(maybe[i].className)=='cover') {
      maybe[i].style.visibility='hidden';
    }
  }
win.style.zIndex = ++new_zi;
	if (all_slave[win.id]) {
		for (var loop in all_slave[win.id]) {
			all_slave[win.id][loop].className = String(all_slave[win.id][loop].className).replace(' backwin', '');
			all_slave[win.id][loop].style.zIndex = ++new_zi;
			all_slave[win.id][loop].style.visibility = 'visible';
		}
		win.className = String(win.className).replace(' backwin', '');
	}
	for (var x in all_sticky) {
		all_sticky[x].style.zIndex = ++new_zi;
		all_sticky[x].className = String(all_sticky[x].className).replace(' backwin', '');
	}
}

function create_win_template(original) {
  if (original) {
	if (magic['bg_colour']) {
      original.getElementsByTagName('div')[0].style.backgroundColor=magic['bg_colour']
      get_content_pane(original).style.borderColor=magic['bg_colour']
      get_content_pane(original).style.backgroundColor=magic['bg_lighter']
	}
    win_template = original.cloneNode(true);
    win_template.id = 'win_0';
  } else {
    win_template=default_template();
  }
}

// Clone a window to a new one
function new_win(original, pane_id, title_text, wid) {
  var new_win = win_template.cloneNode(true);
  try {
    var temp= document.getElementById(original).cloneNode(true);
	new_win= temp;
  } catch (e) { ; }
  no_windows = no_windows + 1;
  new_win.id = 'win_' + no_windows;
  try {
    new_win.style.left = window.innerWidth/2 - 250;
    new_win.style.top = window.innerHeight/2 - 175;
  } catch (x) {
    try {
      new_win.style.left = document.body.offsetWidth/2 - 250;
      new_win.style.top = document.body.offsetHeight/2 - 175;
    } catch (e) {
      try {
        new_win.style.left = document.documentElement.clientWidth/2 - 250;
        new_win.style.top = document.documentElement.clientHeight/2 - 175;
      } catch (c) { 
        alert('No viewport data');
        new_win.style.left = 800/2 - 250;
        new_win.style.top = 600/2 - 175;
      }
    }
  }
  get_titlebar(new_win).id = 'title_' + no_windows;
  try {
    get_titlebar(new_win).innerHTML = magic['format_titlebar'](title_text);
  } catch (ex) { 
	try {
	  get_titlebar(new_win).innerHTML=title_text;
	} catch(e){get_titlebar(new_win).innerHTML=get_titlebar(new_win).id;} 
 
  }
  if (wid) {
	  new_win.setAttribute('perc',parseInt(wid));
  }
  try {
	var all_div=new_win.getElementsByTagName('div');
	for (var loop in all_div) {
		if (String(all_div[loop].className)=='close-butt')
		  all_div[loop].onclick=new Function('event','close_win(this.parentNode)');
		if (String(all_div[loop].className)=='min-butt')
		  all_div[loop].onclick=new Function('event','min_win(this.parentNode)');
		else if (String(all_div[loop].className)=='max-butt')
		  all_div[loop].onclick=new Function('event','max_win(this.parentNode)');
	}
  } catch (ex) { ; }
  get_titlebar(new_win).onmousedown=new Function("event", "focus_win(this.parentNode);dragStart(event, this.parentNode);");
  get_content_pane(new_win).id = pane_id;
new_win.style.width='530px';
new_win.style.height='260px';
redraw_win(new_win,'reg');
get_content_pane(new_win).style.backgroundImage='url(images/loading.gif)';
get_content_pane(new_win).style.backgroundRepeat='no-repeat';
get_content_pane(new_win).style.backgroundPosition='center center';
get_content_pane(new_win).innerHTML='';
  var min_icon = document.createElement('div');
  min_icon.className = 'minicon';
  min_icon.id = 'minicon_' + no_windows;
  try {
  if (magic['bg_colour']) min_icon.style.backgroundColor=magic['bg_colour'];
  if (magic['bg_colour']) min_icon.style.border=magic['bg_colour']+' 1px outset';
  } catch (e) {;}
	  min_icon.onclick = new Function("restore_win(this.parentNode, this)");
  try {
	  min_icon.innerHTML = '<div>'+get_title(new_win)+'</div>';
  } catch (e) { min_icon.innerHTML = '<div>'+title_text+'</div>'; }
  min_icon.style.visibility='hidden';

  document.getElementById('top').appendChild(new_win);
  document.getElementById('top').appendChild(min_icon);
  new_win.style.visibility = 'visible';
  var all_div=new_win.getElementsByTagName('div');
  try {
	  for (var y in all_div) {
	  if (String(all_div[y].className).substr(0,6)=='resize')
all_div[y].onmousedown=new Function("event","focus_win(this.parentNode);resize_start(event, this.parentNode, this.className.substr(7));");
	}
	} catch (e) {alert(e);}
  focus_win(new_win);
  new_win.new_pane=true;
  try {
	  magic['template_fix'](new_win);
  } catch (e) {;}
  return new_win;
}

var minicons = new Array();


var dragObj = new Object();
dragObj.zIndex = 0;

// Param: event as the input event object
// Param: id is optional element ID to drag
function dragStart(event, win) {
  var el, x, y;

  if (win) dragObj.elNode = win;
  else {
    if (browser.isIE || browser.isOP) dragObj.elNode = window.event.srcElement;
    if (browser.isNS) dragObj.elNode = event.target;
    // 3 is Text node type
    if (dragObj.elNode.nodeType == 3) dragObj.elNode = dragObj.elNode.parentNode;
  }

  if (browser.isIE || browser.isOP) {
    x = window.event.clientX + document.documentElement.scrollLeft + document.body.scrollLeft;
    y = window.event.clientY + document.documentElement.scrollTop + document.body.scrollTop;
  }
  if (browser.isNS) {
    x = event.clientX + window.scrollX;
    y = event.clientY + window.scrollY;
  }

  dragObj.cursorStartX = x;
  dragObj.cursorStartY = y;
  dragObj.elStartLeft = parseInt(dragObj.elNode.style.left, 10);
  dragObj.elStartTop = parseInt(dragObj.elNode.style.top,  10);

  if (isNaN(dragObj.elStartLeft)) dragObj.elStartLeft = 0;
  if (isNaN(dragObj.elStartTop))  dragObj.elStartTop  = 0;
	if (browser.isIE) {
		try {
			var maybe=(get_content_pane(dragObj.elNode)).getElementsByTagName('iframe');
			maybe[0].style.visibility='hidden';
		} catch (e) {;}
	}
for (var x in all_win) {
	try {
		var maybe=(get_content_pane(all_win[x])).getElementsByTagName('div');
		for (var i in maybe) {
			if (maybe[i].className=='cover' && all_win[x].style.visibility=='visible') {
			maybe[i].style.visibility='visible';
			}
		}
	} catch (e) {;}
}
  if (browser.isIE || browser.isOP) {
    document.attachEvent("onmousemove", dragGo);
    document.attachEvent("onmouseup",   dragStop);
    window.event.cancelBubble = true;
    window.event.returnValue = false;
  } else if (browser.isNS) {
    document.addEventListener("mousemove", dragGo,   true);
    document.addEventListener("mouseup",   dragStop, true);
    event.preventDefault();
  }
}

function dragGo(event) {
  var x, y;

  if (browser.isIE || browser.isOP) {
    x = window.event.clientX + document.documentElement.scrollLeft + document.body.scrollLeft;
    y = window.event.clientY + document.documentElement.scrollTop + document.body.scrollTop;
  } else if (browser.isNS) {
    x = event.clientX + window.scrollX;
    y = event.clientY + window.scrollY;
  }

  dragObj.elNode.style.left = (dragObj.elStartLeft + x - dragObj.cursorStartX) + "px";
  dragObj.elNode.style.top  = (dragObj.elStartTop  + y - dragObj.cursorStartY) + "px";

  if (browser.isIE || browser.isOP) {
    window.event.cancelBubble = true;
    window.event.returnValue = false;
  }
  if (browser.isNS)
    event.preventDefault();
}

function dragStop(event) {
for (var x in all_win) {
  var maybe=(get_content_pane(all_win[x])).getElementsByTagName('div');
  for (var i in maybe) {
	if (maybe[i].className=='cover' && all_win[x].style.visibility=='visible') {
      maybe[i].style.visibility='visible';
    }
  }
}
	if (browser.isIE) {
		try {
			var maybe=(get_content_pane(dragObj.elNode)).getElementsByTagName('iframe');
			maybe[0].style.visibility='visible';
		} catch (e) {;}
	}
  var maybe=(get_content_pane(dragObj.elNode)).getElementsByTagName('div');
  for (var i in maybe) {
	if (maybe[i].className=='cover') {
      maybe[i].style.visibility='hidden';
    }
  }
  if (browser.isIE || browser.isOP) {
    document.detachEvent("onmousemove",dragGo);
    document.detachEvent("onmouseup",dragStop);
  } else if (browser.isNS) {
    document.removeEventListener("mousemove",dragGo,true);
    document.removeEventListener("mouseup",dragStop,true);
  }
}
var docked = new Array();

function get_content_pane(win) {
if (magic['get_content_pane']) return magic['get_content_pane'](win);
var all_div=win.getElementsByTagName('div');
for (var loop in all_div) {
if (all_div[loop].className=='pane')
return all_div[loop];
}
}

function get_titlebar(win) {
if (magic['get_titlebar']) return magic['get_titlebar'](win);
var all_div=win.getElementsByTagName('div');
for (var loop in all_div) {
if (all_div[loop].className=='titlebar')
return all_div[loop];
}
}

function get_window_element(win,txt) {
var all_div=win.getElementsByTagName('div');
for (var loop in all_div) {
if (String(all_div[loop].className)==txt)
return all_div[loop];
}
}

function redraw_win(win,ste) {
	if (magic['redraw_win']) magic['redraw_win'](win,ste);
	else {
		if (ste=='max') {
			if (win.perc) {get_titlebar(win).style.width=win.perc;}
			else if (browser.isIE) get_titlebar(win).style.width=win.style.width;//'100%';
			else get_titlebar(win).style.width='100%';
			get_titlebar(win).style.left='0px';
			get_titlebar(win).style.top='0px';
			get_window_element(win,'max-butt').style.top='3px';
			get_window_element(win,'close-butt').style.top='3px';
			get_window_element(win,'min-butt').style.top='3px';
	
			if (browser.isIE) get_content_pane(win).style.width=win.style.width;
			else get_content_pane(win).style.width='100%';
			try {
				if (magic['pane_offset_left'])get_content_pane(win).style.left=magic['pane_offset_left']+'px';
				else get_content_pane(win).style.left='0px';
			} catch (e) { get_content_pane(win).style.left='0px'; }
			get_content_pane(win).style.top='25px';
			get_content_pane(win).style.height=parseInt(win.style.height)-25+'px';
	
			var alldiv = win.getElementsByTagName('div');
			for (var x in alldiv) if (String(alldiv[x].className).indexOf('resize') != -1) alldiv[x].style.visibility='hidden';
		} else if (ste=='min') {
			var alldiv = win.getElementsByTagName('div');
			for (var x in alldiv) if (String(alldiv[x].className).indexOf('resize') != -1) alldiv[x].style.visibility='hidden';
			try {
				get_window_element(get_content_pane(win),'cover').style.visibility='hidden';
			} catch (e) {;}
			win.style.visibility='hidden';
		} else if (ste=='reg') {
			var alldiv = win.getElementsByTagName('div');
			for (var x in alldiv) {
				if (alldiv[x] && String(alldiv[x].className).indexOf('resize') != -1) 
					alldiv[x].style.visibility='visible';
			}
			if (win.perc) {get_titlebar(win).style.width=win.perc;}
			else get_titlebar(win).style.width=(parseInt(win.style.width)-7)+"px";
			try { 
				get_window_element(win,'max-butt').style.top='8px';
				get_window_element(win,'close-butt').style.top='8px';
				get_window_element(win,'min-butt').style.top='8px';
			} catch (e) {;}
			if (magic['titlebar_offset_left']) get_titlebar(win).style.left=magic['titlebar_offset_left'];
			else get_titlebar(win).style.left='5px';
			if (magic['titlebar_offset_top']) get_titlebar(win).style.left=magic['titlebar_offset_top'];
			else get_titlebar(win).style.top='5px';
			if (magic['pane_offset_right'])get_content_pane(win).style.width=parseInt(win.style.width)-parseInt(magic['pane_offset_left'])-parseInt(magic['pane_offset_right'])+'px';
			else get_content_pane(win).style.width=(parseInt(win.style.width)-7)+"px";
			if (magic['pane_offset_left'])get_content_pane(win).style.left=magic['pane_offset_left'];
			else get_content_pane(win).style.left='5px';
			if (magic['pane_offset_top'])get_content_pane(win).style.top=magic['pane_offset_top'];
			else get_content_pane(win).style.top='30px';
			if (magic['pane_offset_bottom'])get_content_pane(win).style.height=((parseInt(win.style.height))-parseInt(magic['pane_offset_top'])-parseInt(magic['pane_offset_bottom']))+'px';
			else get_content_pane(win).style.height=(parseInt(win.style.height)-33)+"px";
			if (browser.isIE) {
				if (!(magic['pane_offset_right'])) get_content_pane(win).style.width=(parseInt(win.style.width)-10)+"px";
				if (!(win.perc)) get_titlebar(win).style.width=(parseInt(win.style.width)-10)+"px";
				if (!(magic['pane_offset_bottom'])) get_content_pane(win).style.height=(parseInt(win.style.height)-36)+"px";
				try {
					get_window_element(win,'resize-e').style.height=parseInt(win.style.height)-42+'px';
					get_window_element(win,'resize-s').style.width=parseInt(win.style.width)-40+'px';
					get_window_element(win,'resize-n').style.width=parseInt(win.style.width)-40+'px';
					get_window_element(win,'resize-w').style.height=parseInt(win.style.height)-42+'px';
				} catch (e) {;}
			}
			if (browser.isOP) {
				try {
					get_window_element(win,'resize-e').style.height=parseInt(win.style.height)-42+'px';
					get_window_element(win,'resize-s').style.width=parseInt(win.style.width)-42+'px';
					get_window_element(win,'resize-n').style.width=parseInt(win.style.width)-42+'px';
					get_window_element(win,'resize-w').style.height=parseInt(win.style.height)-42+'px';
				} catch (e) {;}
			}
			try {
				var devnull = document.getElementById(win.getAttribute('master')).className;
				var cp = get_content_pane(win);
				cp.style.top = (parseInt(cp.style.top) - 10) + 'px';
				cp.style.height = (parseInt(cp.style.height) + 10) + 'px';
			} catch (e) {;}
		}
	}
}
