/**
 * util
 * @package macem page
*/

var d = document;
var w = window;

var browser = {

	ie : /*@cc_on!@*/false,
	opera : window.opera ? true : false,
	webkit: /Apple|KDE/i.test(navigator.vendor) ,
	gecko : d.getBoxObjectFor!=null, //window.gecko ? true : false,
  //safari: /webkit/.test(navigator.userAgent),
  /*safari : function () {
	  if (navigator.userAgent.indexOf("Safari") != -1) { return true; }
   	return false;
	},*/

	width : d.documentElement.clientWidth,
  height : window.opera?window.innerHeight:d.documentElement.clientHeight,

  fixBackgroundImage : function() {
    this.ie ? d.execCommand('BackgroundImageCache', false, true) : null;
  },
  
	/** =bug select only IE6
	 * create a iframe cover under element */
	iframe : {
		init : function (node, obj) {
	    //iframe.src = '/dummy.gif';
	    node.src = 'javascript:"";';
			node.scrolling = 'no';
			node.frameBorder = 0;
			node.style.border = '0';
	    node.style.position = 'absolute';
	    node.style.top = obj.offsetTop + 'px';
	    node.style.left = obj.offsetLeft + 'px';
	    node.style.width = obj.offsetWidth + 'px';
	    node.style.height = obj.offsetHeight + 'px';
		},
		create : function (self) {
      var node = dom.byClassFirst(self, "cover_iframe", 'iframe');
      if (!node) {
				node = d.createElement ('iframe');
				node.className = 'cover_iframe';
			}
      return node;
		},
		menu : function (obj) {
			//var node = this.create (obj.parentNode); something wrong with dom.byClassFirst(self, "cover_iframe", 'iframe')
			var node = d.createElement ('iframe');
			node.className = 'cover_iframe';
      this.init (node, obj);
	    obj.parentNode.appendChild (node);
	    return node;
		},
		set : function (obj, get) {
		  var node = this.create (get);
      if (!node.parentNode) {
	      this.init (node, get);
		    node.style.zIndex = '-1';
		    node.style.top = '0px';
		    node.style.left = '0px';
		    get.appendChild (node);
		  }
		  node.style.width = obj.offsetWidth + 'px';
		  node.style.height = obj.offsetHeight + 'px';
	    return node;
		},
		scale : function (obj, get) {
			var node = dom.byClassFirst(get, 'cover_iframe', 'iframe');
	    node.style.width = obj.offsetWidth + 'px';
	    node.style.height = obj.offsetHeight + 'px';
		},
		move : function (obj, get) {
			var node = dom.byClassFirst(get, 'cover_iframe', 'iframe');
	    node.style.top = obj.offsetTop + 'px';
	    node.style.left = obj.offsetLeft + 'px';
		}

	},
	
	changeMode : function (href, old_mode, new_mode) {
		return href.replace (new RegExp ('/' + old_mode+ '/'), '/' + new_mode + '/');
	},
	
	parseURL : function () {
    var href = w.location.href;
    if (href.indexOf("#") != -1) {
      var tmp = href.split("#");
      var hash = tmp[1];
      href = tmp[0];
    }
    if (href.indexOf("?") != -1) {
      var tmp = href.split("?");
      var param = tmp[1];
      href = tmp[0];
    }
    var obj = {
      href: href,
      hash: hash,
      param: param ? param.split("&") : null
    }
    //alert(param+hash);
    return obj;
  }
} // end class browser
	
var events = {
  script: null, // IE dom.content.loaded

  /* global array[object()] of objects for addGlobalHandler()
     object.tag, object.nclass, object.name, object.parent_class, object.ancestor
  */
  global: {},
  
  stopPropagation: function (e) {
    if (browser.ie)
  	 window.event.cancelBubble = true;
  	e.stopPropagation();
	},
	
	prevent: function (e) {
	  if (browser.ie) {
			w.event.returnValue = false;
		} else {
			e.preventDefault();
		}
	},
  
	object : function(e) {
		if (browser.ie) { //w.event && !w.opera) {
			e = w.event;
			e.target = e.srcElement;
		}
		return e;
	},
		
	addHandler : function(el, event_name, handler) {
		if (event_name == 'ready') {

			// support for gecko, opera 9.x
			if (document.addEventListener)
				d.addEventListener ("DOMContentLoaded", handler, false);

      // support for Safari, KDE and Opera 8.x
			if ( /WebKit|Khtml/i.test(navigator.userAgent) || (window.opera && parseInt(window.opera.version())<9)) (function(){
				/loaded|complete/.test(document.readyState) ? handler() : setTimeout(arguments.callee, 1);
			})();
			
			// for Internet Explorer (using conditional comments)
			/*@cc_on @*/
			/*@if (@_win32)
			if (!this.script) {
	   		d.write("<script id='__ie_onload' defer src='//:'><\/script>");
				this.script = d.getElementById("__ie_onload");
			}
      this.script.attachEvent('onreadystatechange', handler);
			/*@end @*/

		} else {
			if (el && el.addEventListener) {
				el.addEventListener (event_name, handler, false); // bubbling set true to capturing
			} else if (el) {
				el.attachEvent ('on'+ event_name, function(evt) {
          handler (events.object(evt));
        });
			}
		}
	},
	
	removeHandler : function(el, event_name, handler) {
    /*if (el.removeEventListener) {
			el.removeEventListener (event_name, handler, false);
		} else {
      el.detachEvent (event_name, handler);
    }*/
  },

  addGlobalHandler : function (container, event_name, obj) {
    var _this = this;
    this.addHandler (container, event_name, function(e) {
      var self = e.target;
      var selfTag = self.nodeName.toLowerCase();
      var selfName = self.name;

      for (var i = 0; i < obj.length; i++) {
        if (obj[i]) {
          var is = 0;

          if (obj[i].tag)
            obj[i].tag == selfTag ? is = 1 : is = 0;
            
          if (obj[i].name)
            obj[i].name == selfName ? is *= 1 : is *= 0;
          if (obj[i].nclass)
            dom.hasClass (self, obj[i].nclass) == true ? is *= 1 : is *= 0;
          if (obj[i].parent_tag)
            self.parentNode.nodeName.toLowerCase() == obj[i].parent_tag ? is *= 1 : is *= 0;
          if (obj[i].parent_class)
            dom.hasClass (self.parentNode, obj[i].parent_class) == true ? is *= 1 : is *= 0;
          if (obj[i].ancestor)
            dom.byTagAncestor (self, obj[i].ancestor) ? is *= 1 : is *= 0;
          if (obj[i].ancestor_class) {
            dom.byClassParent (self, obj[i].ancestor_class) ? is *= 1 : is *= 0;
          }

          //alert(selfTag+dom.byClassParent (self, obj[i].ancestor_class).className);
          //dom.byId('event').innerHTML = selfTag;

          if (is == 1 && obj[i].handler) {
            obj[i].handler (self, e);
            if (obj[i].prevent == true) {
              events.prevent(e);
            }
            if (obj[i].once == true) {
              //obj.splice(i,1);
              obj[i] = null;
            }
          }
        }
      }
    });

    // automatic delete object onunload
    this.addHandler (w, 'unload', function() {
      delete obj;
    });
    
    return obj;
  }
  
} // end class events
	
var html = {

	create : function (tag_name, parent_el, mode) {
    var elem = d.createElement (tag_name);
    if (parent_el) this.insert(elem, parent_el, mode);
    return elem;
	},
	
	text : function (parent_el, text, mode) {
    var elem = d.createTextNode (text);
    if (parent_el) this.insert(elem, parent_el, mode);
    return elem;
	},
	
	insert : function(node, parent_el, mode) {
		switch(mode) {
			case "after":
			  var after = dom.nextTagSibling(parent_el);
				if (after[0]) {
			    parent_el.parentNode.insertBefore (node, after[0]);
			  } else {
       		parent_el.parentNode.appendChild (node);
			  }
			break;
			case "before":
				if (parent_el) parent_el.parentNode.insertBefore (node, parent_el);
			break;
			case "first":
			  var first = parent_el.getElementsByTagName('*');
				if (first[0]) {
    			parent_el.insertBefore (node, first[0]);
			  } else {
			    parent_el.appendChild (node);
			  }
			break;
			case "replace":
				if (parent_el) parent_el.parentNode.replaceChild (node, parent_el);
			break;
			default: /* last */
			  if (parent_el) parent_el.appendChild (node);
			break;
		}
		return node;
	},

  remove : function (el) {
		if (!el) return;
    el.parentNode.removeChild (el);
		return el.parentNode;
  },
  
  opacity : {
		set: function(el, value) {
	  	if (browser.ie) {
				el.style.filter = "Alpha(Opacity=" + (value * 100) + ")";
			} else {
				el.style.opacity = value;
			}
			return el;
		},
		get : function(el) {
			if (browser.ie) {
				var value = (el.filters && el.filters.alpha &&  typeof el.filters.alpha.opacity == "number"  ? el.filters.alpha.opacity : 100) / 100;
			} else {
				var value = el.style.opacity || 1;
			}
			return value;
		}
	},

	attr : function(el, attribute, value) {
    if (value) {
      el.setAttribute (attribute, value);
    } else {
      return el.getAttribute (attribute);
    }
  },
  
  css : function(el, property, value) {
    if (value) {
      el.style[property] = value;
    } else {
      return el.style[property];
    }
  }
  
} // end class html
	
var dom = {

	byId: function (id_name) {
     return d.getElementById (id_name);
	},
	
	// find element parently
	byClassParent : function(parent_el, class_name) {
    var selected_kids = [];
		var this_el = parent_el;
		while (this_el.parentNode) {
      this_el = this_el.parentNode;
   		if (this.hasClass(this_el, class_name)) {
    		selected_kids.push(this_el);
        break;
			}
		}
		//alert(selected_kids[0].tagName + selected_kids[0].className);
  	return selected_kids[0];
	},
	
	// find element parently
	byTagAncestor : function(parent_el, tag_name) {
    var selected_kids = [];
		var this_el = parent_el;
		while (this_el.parentNode) {
      this_el = this_el.parentNode;
   		if (this_el.tagName && this_el.tagName.toLowerCase() == tag_name) {
    		selected_kids.push(this_el);
      	break;
			}
		}
  	return selected_kids[0];
	},
	
	byTagName : function(parent_el, tag_name) {
    if (!parent_el) return 0;
    return parent_el.getElementsByTagName(tag_name);
	},
	
	byTagFirst : function(parent_el, tag_name) {
    if (!parent_el) return 0;
    return parent_el.getElementsByTagName(tag_name)[0];
	},
	
	byClassFirst : function(parent_el, class_name, tag_name) {
		tag_name = tag_name || '*';
		var kids = parent_el.getElementsByTagName(tag_name);
    var selected_kids = null;
		for (var i = 0; i < kids.length; i++) {
			if (this.hasClass(kids[i], class_name)) {
      	selected_kids = kids[i];
      	break;
			}
		}
		return selected_kids;
	},

	byClassName : function(parent_el, class_name, tag_name) {
		tag_name = tag_name || '*';
		var kids = parent_el.getElementsByTagName(tag_name);
		var selected_kids = [];
		for (var i = 0; i < kids.length; i++) {
			if (this.hasClass(kids[i], class_name)) {
				selected_kids.push(kids[i]);
			}
		}
		return selected_kids;
	},
	
	/**
	 *  = only sibling DOM elements tagName=div|p...
	 */
	nextTagSibling : function(self, class_name, tag_name) {
		var selected_kids = [];
  	while (self.nextSibling) {
			var kids = self.nextSibling;
			var node_name = kids.nodeName.toLowerCase();
			if (tag_name && tag_name.indexOf(node_name) != -1 && class_name && this.hasClass(kids, class_name)) {
      	selected_kids.push(kids);
			} else if (tag_name && tag_name.indexOf(node_name) != -1 && !class_name) {
        selected_kids.push(kids);
			} else if (class_name && this.hasClass(kids, class_name) && !tag_name) {
        selected_kids.push(kids);
			} else if (!class_name && !tag_name && kids.nodeType == 1) {
        selected_kids.push(kids);
			}
			self = self.nextSibling;
		}
		return selected_kids;
	},
	
	/**
	 *  = only sibling DOM elements tagName=div|p...
	 */
	previousTagSibling : function(parent_el, class_name, tag_name) {
		var selected_kids = [];
  	while(parent_el.previousSibling) {
			var kids = parent_el.previousSibling;
			var node_name = kids.nodeName.toLowerCase();
			if (tag_name && tag_name.indexOf(node_name) != -1 && class_name && this.hasClass(kids, class_name)) {
      	selected_kids.push(kids);
			} else if (tag_name && tag_name.indexOf(node_name) != -1 && !class_name) {
        selected_kids.push(kids);
			} else if (class_name && this.hasClass(kids, class_name) && !tag_name) {
        selected_kids.push(kids);
			} else if (!class_name && !tag_name && kids.nodeType == 1) {
        selected_kids.push(kids);
			}
			parent_el = parent_el.previousSibling;
		}
		return selected_kids;
	},
	
	/**
	 *  = only sibling DOM elements tag_name=div|p...
	 */
	byClassSibling : function(parent_el, class_name, tag_name) {
		var kids = parent_el.childNodes;
    var selected_kids = [];
		for (var i = 0; i < kids.length; i++) {
			var node_name = kids[i].nodeName.toLowerCase();
			if (tag_name && tag_name.indexOf(node_name) != -1 && class_name && this.hasClass(kids[i], class_name)) {
      	selected_kids.push(kids[i]);
			} else if (tag_name && tag_name.indexOf(node_name) != -1 && !class_name) {
        selected_kids.push(kids[i]);
			} else if (class_name && this.hasClass(kids[i], class_name) && !tag_name) {
        selected_kids.push(kids[i]);
			} else if (!class_name && !tag_name && kids[i].nodeType == 1) {
        selected_kids.push(kids[i]);
			}
		}
		return selected_kids;
	},

	hasClass : function(el, class_name) {
    if (!el) return;
    var c = " " + el.className + " ";
		if (c.indexOf(" " + class_name + " ") != -1) {
			return true;
		}
		return false;
	},
		
	addClass : function(el, class_name) {
    if (!el) return;
    if (this.hasClass(el, class_name)) {
			return el;
		}
		if (el.className == '') {
			el.className = class_name;
		} else {
			el.className = el.className + ' ' + class_name;
		}
		return el;
	},
		
	removeClass : function(el, class_name) {
    if (!el) return;
    el.className = el.className.replace(new RegExp('(^|\s)?' + class_name + '(\s|$)?'), '$1$2').replace(/\s{2,}/, " ");
		return el;
	},
		
	replaceClass : function(el, old_class, new_class) {
    if (!el) return;
    this.removeClass(el, old_class);
		this.addClass(el, new_class);
		return el;
	}
} // end class dom
	
var ajax = {

	get : function(url, readyCallback) {
		var request = new this._getRequest();
		request.onreadystatechange = function() {
			if (ajax._isReady(request)) {
        // /^ERROR/i.test()
				readyCallback(request);
			}
		}
		request.open("GET", url, true);
    //+ encodeURIComponent((new Date()).getTime())
    request.setRequestHeader('If-Modified-Since', 'Sat, 1 Jan 2000 00:00:00 GMT');
    request.setRequestHeader('Cache-Control', 'no-cache');
    request.send(null);
	},

	post : function(url, parameters, readyCallback) {
		var request = new this._getRequest();
		request.onreadystatechange = function() {
			if (ajax._isReady(request)) {
				readyCallback(request);
			}
		}
		request.open("POST", url, true);
		request.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");
    request.setRequestHeader("Content-length", parameters ? parameters.length : 0);
    request.setRequestHeader("Connection", "close");

    request.setRequestHeader('If-Modified-Since', 'Sat, 1 Jan 2000 00:00:00 GMT');
    request.setRequestHeader('Cache-Control', 'no-cache');
      /*request.setRequestHeader( "Pragma", "no-cache" );
      request.setRequestHeader( "Cache-Control", "must-revalidate" );
      request.setRequestHeader( "Cache-Control", "no-cache" );
      request.setRequestHeader( "Cache-Control", "no-store" );
      request.setRequestHeader("Expires", 0);*/
    
		request.send(parameters ? parameters : ""); // FF bug
	},

	_getRequest : function() {
		var request;
		if (w.XMLHttpRequest) {
			request = new XMLHttpRequest();
		} else {
			try {
				request = new ActiveXObject("Msxml2.XMLHTTP");
			} catch (e) {
				try {
					request = new ActiveXObject("Microsoft.XMLHTTP");
				} catch (e) {
					request = false;
				}
			}
		}
		return request;
	},

	_isReady : function(request) {
		if (request.readyState == 4 && request.status == 200) {
			return true;
		}
		return false;
	},
		
	getParams : function (form) {
   	var params = "";
		for (var i=0; i<form.length; i++) {
			switch (form.elements[i].type) {
				case "checkbox":
          // when url with & should be escape
          if (form.elements[i].checked == true) { params += "&" + form.elements[i].name + "=" + encodeURIComponent(form.elements[i].value); }
					break;
				default:
					if (form.elements[i].name != undefined) { params += "&" + form.elements[i].name + "=" + encodeURIComponent(form.elements[i].value); }
					break;
			}
	  }
	  return params;
	}
} // end class ajax
	
var widget =  {

	show : function (el) {
   	if (el) el.style.display = 'block';
		return el;
	},

	hide : function (el) {
	  if (el) el.style.display = 'none';
	  return el;
	},
	
	resize : function (el, width, height) {
    el.style.width = width;
    el.style.height = height;
    return el;
	},

	/* Important: first use show then this method */
	center : function (el) {
	  var scroll_left = d.documentElement.scrollLeft;
	  var scroll_top = d.documentElement.scrollTop;
		var left = (d.documentElement.clientWidth/2) + scroll_left - (el.offsetWidth/2);
		var top = ((browser.opera?window.innerHeight:d.documentElement.clientHeight)/2) + scroll_top - (el.offsetHeight/2);
	  el.style.left =  Math.max(0, left) + 'px';
	  el.style.top =  Math.max(0, top) + 'px';
	  return el;
	},

	/** =window
	 * @structure: div -> h1.title, button.close
	*/
	window : {

		current: {
			scroll: null
		},
		
		create : function (id, title, parent, callback_close) {
      var _window = html.create ('div');
      _window.id = id;
      var header = html.create ('h1', _window);
      html.text (header, title);
      header.title = "przesuń okno";
      var closed = html.create ('button', _window);
      dom.addClass (closed, "close");
      closed.title = "zamknij okno";
      html.create ('div', _window);
      parent.appendChild (_window);
      this.init (_window, callback_close);
      return _window;
    },
    
		init : function (_window, callback_close) {
			if (_window) {
        dom.addClass (_window, 'window');
				var header = dom.byTagFirst (_window, 'h1');
				var closed = dom.byTagFirst (_window, 'button');
				if (header) {
					header.onmouseover = _window.onclick = function(evt) {
            widget.window.bringTop (_window, 200);
					}
					header.onmousedown = widget.window.scrollwindow;
					header.onmouseup = widget.window.noscrollwindow;
				}
				if (closed) {
					closed.onclick = function(evt) {
						widget.window.hide (_window);
						callback_close ? callback_close(evt) : null;
						return false;
					};
				}
			}
			return _window;
		},
		
    focus : function (_window) {
			if (_window) {
        var closed = dom.byTagFirst (_window, 'button');
        if (closed) { closed.focus(); }
			}
		},
		
		hide : function (_window) {
	   	if (_window)
				_window.style.top = '-9999px';
			return _window;
		},
		
    show : function (_window) {
	   	if (_window) {
				//_window.style.top = '0';
		   	this.bringTop (_window, 200);
		   	widget.center (_window);
		   	this.focus (_window);
		   	if (browser.ie)
         browser.iframe.set (_window, _window);
	   	}
			return _window;
		},
	
		bringTop : function (_window, zIndex) {
			if (_window.style.zIndex != zIndex+1) {
				var windows = dom.byClassName (d.body, 'window', '*');
				for (var i=0; i<windows.length; i++) {
	        windows[i].style.zIndex = zIndex;
				}
				_window.style.zIndex = zIndex+1;
			}
			/*var i=iter;
			do {
			  // do something here
			} while (--i);
			
			} */
			return _window;
		},

	  set_header : function (_window, contents) {
      var header = dom.byTagFirst (_window, 'h1');
      if (header[0]) {
      	header[0].innerHTML = contents;
      }
      return _window;
		},
		
		set : function (_window, contents) {
      var content = dom.byTagName (_window, 'div');
      if (content[0]) {
      	content[0].innerHTML = contents;
        // init widgets
        widget.pane.init (_window);
      }
      return _window;
		},

		get_html : function (action, params, func) {
			widget.status.show ('<h1 class="loading">loading...</h1>');
			ajax.post (action, params, function(req){
				if (req.responseText) {
					widget.status.hide ();
					func (req.responseText, action);
				} else {
          widget.dialog.show ('Error occured', req.responseText);
				}
			});
		},
		
		// start scrolling
		scrollwindow : function (e, callback) {
      var _window = events.object(e).target;
      widget.window.current.scroll = _window;
			_window.parentNode.posx = (!e ? event.clientX + d.documentElement.scrollLeft: e.pageX) - _window.parentNode.offsetLeft;
      d.onmousemove = function (e) {
        widget.window.scrolling(e, callback);
      }
      d.onselectstart = new Function ("return false"); /* prevent selection text */
		},

		// stop scrolling
		noscrollwindow : function (e, callback) {
		  widget.window.current.scroll = null;
		  d.onmousemove = null;
		  d.onselectstart = null;
		  if (callback)
        callback (widget.window.current.scroll);
		},
			
		// srolling window
		scrolling : function (e, callback){
      var _window = widget.window.current.scroll;
      if (!_window) return;

			e ? posx = e.pageX : posx = event.clientX + d.documentElement.scrollLeft;
			e ? posy = e.pageY : posy = event.clientY + d.documentElement.scrollTop;
			
    	// new x and y value
			//if(tempX < (document.documentElement.clientWidth-240) && tempX > 200){

      if (callback)
        callback (_window.parentNode, posx, posy);
      
			_window.parentNode.style.left = posx - _window.parentNode.posx + 'px';
      _window.parentNode.style.top = posy - (_window.scrollHeight * 0.7) + 'px';

      browser.ie ? window.event.returnValue = false : 0;
		}
	},
		
	/** =dialog window
	 * @important: could be only one dialog per page
	*/
	dialog : {

		show : function (head, comment, reload) {
	    var _dialog = dom.byId ('dialog');
	    if (!_dialog) {
				_dialog = d.createElement('div');
				var header = html.create ('h1', _dialog);
				var close = html.create ('button', _dialog);
				var content = html.create ('p', _dialog);
        dom.addClass (_dialog, 'window');
				_dialog.id = 'dialog';
		    close.className = 'close';
	    }
	    _dialog.getElementsByTagName('h1')[0].innerHTML = head;
	    _dialog.getElementsByTagName('p')[0].innerHTML = comment;
      widget.window.init (_dialog, function (evt) {
				if (reload)
          w.location.reload(true);
			});
	    d.body.appendChild (_dialog);
      widget.show (_dialog);
			widget.center (_dialog);
			this.focus (_dialog);
			if (browser.ie)
        browser.iframe.set (_dialog, _dialog);
		},
		focus : function (_dialog) {
			if (_dialog) {
        var closed = dom.byTagFirst (_dialog, 'button');
        if (closed)
          closed.focus();
			}
		},
		hide : function () {
		  var _dialog = dom.byId ('dialog');
		  widget.hide (_dialog);
		}
	},
	
	/* =status bar
	 *
	*/
	status_bar : {
	
		show : function (message) {
	    var _status_bar = dom.byClassFirst (d.body, 'statusbar', '*');
	    if (!_status_bar) { return; }
	    _status_bar.innerHTML = message;
	    //d.body.appendChild (status);
      widget.show (_status_bar);
			//widget.center (status);
		},

		hide : function () {
      var _status_bar = dom.byClassFirst (d.body, 'statusbar', '*');
		  widget.hide (_status_bar);
		}

	},

	/* =status window
	 *
	*/
	status : {

		show : function (message) {
	    var _status = dom.byId ('status');
	    if (!_status) {
				_status = d.createElement('div');
		    _status.id = 'status';
	    }
	    _status.innerHTML = message;
	    d.body.appendChild (_status);
      widget.show (_status);
			widget.center (_status);
		},

		hide : function () {
		  var _status = dom.byId ('status');
		  widget.hide (_status);
		}

	},
	
	history : {
    href: w.location.href,
    run: [],
    
    init : function () {
      widget.history.url = w.location.href;
      w._historyInterval = w.setInterval(function(e) {
        //alert(widget.history.href + w.location.href);
        if (widget.history.href != w.location.href) {
          for(var i=0; i<widget.history.run.length; i++) {
            widget.history.run[i]();
          }
          widget.history.href = w.location.href
        }
      }, 200);
    },
    
    // push init function for history ajax or js
    push : function (func) {
      widget.history.run.push(func);
    }
  },
  
	/* =pane
	 * @structure: div.pane -> .form -> ul.navs -> li.first [open], fieldset.first [open]
	*/
	pane : {

    init : function (container, event_handler) {
      var pane_heads = dom.byClassName (container, 'navs', 'ul');
      for (var i = 0; i < pane_heads.length; i++) {
        var pane = pane_heads[i].parentNode;
        var pane_lis = pane_heads[i].getElementsByTagName ('li');
        var pane_open_span = dom.byTagFirst (pane_lis[0], 'span');

        // init pane from url
        /*var pane_from_url = w.location.hash;
        if (pane_from_url) {
          var pane_id = pane_from_url.split("_")[2];
          var pane_open_name = pane_from_url.split("_")[1];
          if (i == pane_id) {
            var pane_li = dom.byClassFirst (pane_heads[i], pane_open_name);
            pane_open_span = dom.byTagFirst (pane_li, 'span');
          }
        } */
        
        this.toggle (pane_open_span);
			}
			if (event_handler) {
        event_handler.push (this.append()[0]);
      }
    },
    
    toggle : function (self) {
      var pane_head = dom.byTagAncestor (self, 'ul');
      if (dom.hasClass (pane_head, 'navs')) {
				var pane = pane_head.parentNode;
   			var pane_fields = pane.getElementsByTagName ('fieldset');
        var pane_lis = pane_head.getElementsByTagName ('li');
        var pane_li = dom.byTagAncestor (self, 'li');
        // prevent click on opened pane
      	if (dom.hasClass (pane_li, 'open')) return false;

        for (var i = 0; i < pane_fields.length; i++) {
          //var ss = pane_fields[i];  bug IE
          if (pane_fields[i].className.indexOf (pane_li.className) != -1/* dom.hasClass(ss,pane_li.className)*/) {
            dom.addClass (pane_lis[i], 'open');
            dom.removeClass (pane_fields[i], 'hide');
					} else {
            dom.removeClass (pane_lis[i], 'open');
            dom.addClass (pane_fields[i], 'hide');
					}
				}
				//callback ? callback (self) : null;
      }
    },
    
    append : function () {
      var _this = this;
      var obj = new Array();
      
      obj.push ({
        tag: 'span',
        ancestor_class: 'navs',
        prevent: true,
        handler: function(self, e) {
          _this.toggle (self);
        }
      });
      
      return obj;
      //events.addGlobalHandler (container, 'click', obj);

      // back button
      /*widget.history.push(function() {
        var tab_index = 0;
        var tab_from_url = w.location.href.split("#");
        if (tab_from_url[1]) tab_index = tab_from_url[1].split("_")[2]||0;
        var navs = dom.byClassName (dom.byId('container'), 'navs', 'ul')[0];
        if (navs) {
				  var nav_lis = navs.getElementsByTagName('li');
          var fieldsets = navs.parentNode.getElementsByTagName('fieldset');
				  for (var j = 0; j < nav_lis.length; j++) {
            dom.removeClass(nav_lis[j], 'open');
            dom.removeClass(fieldsets[j], 'open');
            if (tab_index == j) {
              dom.addClass(nav_lis[j], 'open');
              dom.addClass(fieldsets[j], 'open');
            }
          }
				}
      });*/
		},
		
		disable : function (pane_el, pane_name) {
    	var navs = dom.byClassName (pane_el, 'navs', 'ul')[0];
			var fieldsets = pane_el.getElementsByTagName('fieldset');
			if (navs && fieldsets) {
				var nav_lis = navs.getElementsByTagName('li');
				for (var i = 0; i < nav_lis.length; i++) {
				  if (nav_lis[i].className == pane_name)
          	nav_lis[i].style.display = "none";
          if (fieldsets[i].className == pane_name)
          	fieldsets[i].style.display = "none";
				}
			}
		},
		
		enable : function (pane_el, pane_name) {
    	var navs = dom.byClassName (pane_el, 'navs', 'ul')[0];
			var fieldsets = pane_el.getElementsByTagName('fieldset');
			if (navs && fieldsets) {
				var nav_lis = navs.getElementsByTagName('li');
				for (var i = 0; i < nav_lis.length; i++) {
				  if (nav_lis[i].className == pane_name)
          	nav_lis[i].style.display = "";
          if (fieldsets[i].className == pane_name)
          	fieldsets[i].style.display = "";
				}
			}
		}
		
	},
	
	/* =cover
	 * @:
	*/
	cover : {
		create : function (parent) {
			var _cover = html.create ('p', parent, 'last');
			dom.addClass (_cover, 'cover');
	    _cover.style.width = parent.offsetWidth + "px";
	    _cover.style.height = parent.offsetHeight + "px";
	    return _cover;
    },
    
    remove : function (parent) {
      var _cover = dom.byClassFirst (parent, 'cover', 'p');
      if (_cover) html.remove(_cover);
    }
	},
	
	/* =dnd
	 * @:
	*/
	dnd : {

    current: [],
    drop: { target: null, position: 'bottom'},
    
    create : function (obj, source, container) {

      obj.style.cursor = "move";

      dom.addClass (source, 'source-0');
      if (!dom.hasClass (container, 'destination-0'))
        dom.addClass (container, 'destination-0');
      
      obj.onmousedown = function(e) {
        var _window = events.object(e).target.parentNode;
        if (!dom.hasClass (_window, "source-0")) return;
        
        _window.style.width = obj.offsetWidth + "px";
        _window.style.height = obj.offsetHeight + "px";
        _window.style.position = "absolute";
        _window.style.zIndex = "10000";

        dom.addClass (_window, "dragged");
        
        var line = html.create ('div', d.body);
        line.id = "separate-source";
        line.style.position = "absolute";
        
        var con = dom.byClassFirst (d.body, 'destination-0');
        widget.dnd.current[0] = con;

        widget.window.scrollwindow(e, function(self, posx, posy) {
          var left = widget.dnd.current[0].offsetLeft;
          var right = widget.dnd.current[0].offsetLeft + widget.dnd.current[0].offsetWidth;
          
          var top = widget.dnd.current[0].offsetTop;
          var bottom = widget.dnd.current[0].offsetTop + widget.dnd.current[0].offsetHeight;
          
          if (left < posx && right > posx && top < posy && bottom > posy) {
            dom.addClass (widget.dnd.current[0], "inside");
          } else {
            dom.removeClass (widget.dnd.current[0], "inside");
          }
          
          var sources = dom.byClassName (widget.dnd.current[0], 'source-0');
          for (var i = 0; i < sources.length; i++) {
            if (!dom.hasClass(sources[i], "dragged")) {
              var aleft = sources[i].offsetLeft;
              var aright = sources[i].offsetLeft + sources[i].offsetWidth;

              var atop = sources[i].offsetTop;
              var abottom = sources[i].offsetTop + sources[i].offsetHeight;

              if (aleft < posx && aright > posx && atop < posy && abottom > posy) {
                var next = dom.nextTagSibling (sources[i], 'source-0');
                var previous = dom.previousTagSibling (sources[i], 'source-0');

                widget.dnd.drop.target = null;
                
                if (!dom.hasClass(next[0], "dragged")) {
                  dom.byId('separate-source').style.left = aleft + "px";
                  dom.byId('separate-source').style.top = abottom + "px";
                  dom.byId('separate-source').style.width = sources[i].offsetWidth + "px";

                  widget.dnd.drop.target = sources[i];
                  widget.dnd.drop.position = 'bottom';
                  break;
                  
                } else if (!previous.length && (atop-30) < posy && (atop+20) > posy) {
                  dom.byId('separate-source').style.top = atop + "px";
                  dom.byId('separate-source').style.left = aleft + "px";
                  
                  widget.dnd.drop.target = sources[i];
                  widget.dnd.drop.position = 'top';
                  break;
                } else {
                  dom.byId('separate-source').style.left = "-9999px";
                }
              } else {
                //dom.removeClass (sources[i], "inside");
                widget.dnd.drop.target = null;
                dom.byId('separate-source').style.left = "-9999px";
              }
            }
          }
        });
      }
      
			obj.onmouseup = function(e) {
        var _window = events.object(e).target.parentNode;
        _window.removeAttribute("style");
        dom.removeClass (_window, "dragged");
        html.remove(dom.byId('separate-source'));
        
        widget.window.noscrollwindow(e);
        dom.removeClass (widget.dnd.current[0], "inside");
        
        if (widget.dnd.drop.target) {
          if (widget.dnd.drop.position == "bottom") {
            html.insert (_window, widget.dnd.drop.target, "after");
          } else {
            html.insert (_window, widget.dnd.drop.target, "before");
          }
          
          widget.dnd.drop.target = null;
        }
        widget.dnd.current[0] = null;
      }
    }
	}
	
} // end class widget

//events.addHandler(w, 'load', widget.history.init);
