/**
 * util
 * @package macem page
*/

/*
function getElementsByClass(classname, node)
{
	var a = [];
	var re = new RegExp('(^|\\s)' + classname + '(\\s|$)');
	if(node == null) node = document;
	var els = node.g
	etElementsByTagName("*");
	for(var i=0,j=els.length; i<j; i++)
		if(re.test(els[i].className)) a.push(els[i]);
	return a;
}*/

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,
  /*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';
		}

	},

	modes : ['index', 'edit', 'plain', 'action', 'print'],

	changeMode : function (href, old_mode, new_mode) {
    for (var i = 0; i < this.modes.length; i++) {
      if (href.indexOf('/' + this.modes[i]+ '/') != -1) {
        return href.replace (new RegExp ('/' + this.modes[i] + '/'), '/' + 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)
    };
    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 : {
    container: []
  },

  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;
	},

  load_events : [],

	addHandler : function (el, event_name, handler) {
		//console.log('ss');
        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)
			if (d.attachEvent) {
        if (!this.script) {
          
          d.write("<script id='_ie_onload' defer src='//:'><\/script>");
  				this.script = d.getElementById("_ie_onload");
          
          this.script.onreadystatechange = function() {
            try {
            if (this.readyState == "complete") {
              handler(); // call the onload handler
              while (exec = events.load_events.shift())
                exec();
            }
            } catch(e) {}
          };
          
        }
        //this.script.attachEvent('onreadystatechange', handler);
        /*events.load_events.push(handler);*/
			}

		} 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;
    
    // memory leak
    _this.addHandler (container, event_name, function(e) {
      var self = e.target;
      var selfTag = self.nodeName.toLowerCase();
      var selfName = self.name;

      //alert(obj.length);

      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[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":
        // node is a new node
				if (parent_el) parent_el.parentNode.replaceChild (node, parent_el);
			break;*/
			default: /* last */
			  if (parent_el) { parent_el.appendChild (node); }
			break;
		}
		return node;
	},
	replace : function(node, parent_el) {
    // node is a new node
  	if (parent_el) { parent_el.parentNode.replaceChild (node, parent_el); }
	},

  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()) */
    // x.setRequestHeader("Referer"+String.fromCharCode(205)+ String.fromCharCode(155),"http://www.referrer.tld");

    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, contents, callback_close) {
      var _window = dom.byId(id);
      if (!_window) {
        _window = html.create ('div');
        _window.id = id;
        _window.className = id;
        var header = html.create ('h1', _window);
        header.title = "przesuń okno";
        var closed = html.create ('a', _window);
        dom.addClass (closed, "close");
        closed.title = "zamknij okno";
        html.create ('div', _window);
        var resize = html.create ('span', _window);
        dom.addClass (resize, "resize");        
        parent.appendChild (_window);
      }
      this.set (_window, contents);
      html.text (header, title);
      this.init (_window, callback_close);
      return _window;
    },

		init : function (_window, callback_close) {
			if (!_window) { return 0; }

      dom.addClass (_window, 'window');
			var header = dom.byTagFirst (_window, 'h1');
			var closed = dom.byTagFirst (_window, 'a');
			if (header) {
				header.onmouseover = _window.onclick = function(e) {
          widget.window.bringTop (_window, 300);
				};
				header.onmousedown = widget.window.scrollwindow;
				header.onmouseup = widget.window.noscrollwindow;
			}
			if (closed) {
				closed.onclick = function(e) {
					widget.window.hide (_window);
					callback_close ? callback_close(e) : null;
					return false;
				};
			}

			return _window;
		},

    focus : function (_window) {
			if (_window) {
        var closed = dom.byTagFirst (_window, 'a');
        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, 300);
		   	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;
        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 (e) {
				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
	 * display status information on top page
	*/
	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);
		}

	},


	/* =cover
	 * @:
	*/
	cover : {
		create : function (parent, text, nclass) {
      dom.addClass (parent, 'cover-parent');
      var _cover = html.create ('div', parent, 'last');
  		dom.addClass (_cover, 'cover');
  		if (nclass) { dom.addClass (_cover, nclass); }
      var _layer = html.create ('div', _cover);
      dom.addClass (_layer, 'layer');
  		if (text) {
        var _loader = html.create ('p', _cover);
        html.text(_loader, text);
      }
      _cover.style.width = parent.offsetWidth + "px";
	    _cover.style.height = parent.offsetHeight + "px";
	    return _cover;
    },

    hideLoader : function (parent) {
      var _loader = dom.byTagFirst(parent, 'p');
      if (_loader) { _loader.style.display = "none"; }
    },

    remove : function (parent) {
      var _cover = dom.byClassFirst (parent, 'cover', 'div');
      if (_cover) {
        html.remove(_cover);
        dom.removeClass (parent, 'cover-parent');
      }
    }
	},

	history : {
    href: w.location.href,
    run: [],

    init : function () {
      widget.history.url = w.location.href;
      w._historyInterval = w.setInterval(function(e) {
        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, 'replace-bar', 'ul');
      for (var i = 0; i < pane_heads.length; i++) {
        dom.replaceClass(pane_heads[i], 'replace-bar', 'panebar');
        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, 'panebar')) {
				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
          dom.addClass(dom.byTagFirst(pane_fields[i], 'legend'), "hide");
          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: 'panebar',
        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'), 'panebar', '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, 'panebar', '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, 'panebar', '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 = "";
          }
				}
			}
		}

	},

	/* =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 {
                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);

//console.log( 'util run:', timers.stop() );