function $(el) {
    return document.getElementById(el)
    }

function logger(txt) {
	try {
		console.log(txt);
		} catch(e){}
	}
	
function addLoadListener(fn) {
	if (typeof window.addEventListener != 'undefined') {
		window.addEventListener('load', fn, false);
		}
	else if (typeof document.addEventListener != 'undefined') {
		document.addEventListener('load', fn, false);
		}
	else if (typeof window.attachEvent != 'undefined') {
		window.attachEvent('onload', fn);
		}
	else {
		var oldfn = window.onload;
		if (typeof window.onload != 'function') {
			window.onload = fn;
			}
		else {
			window.onload = function() {
			oldfn();
			fn();
			};
		}
	}
}

var ie = (navigator.userAgent.toLowerCase().indexOf("msie 6") != -1)    
var ie7 = (window.ActiveX && window.XMLHttpRequest);

Object.extend = function(destination, source) {
	for (var property in source) {
		destination[property] = source[property];
	}
	return destination;
}

var Class = {
  create: function() {
    return function() {
      this.initialize.apply(this, arguments);
    }
  }
}

document.getElementsByClassName = function(className, tag) {
  var children = document.getElementsByTagName(tag || '*') || document.all;
  var elements = new Array();
 
  for (var i = 0; i < children.length; i++) {
    var child = children[i];
    var classNames = child.className.split(' ');
    for (var j = 0; j < classNames.length; j++) {
      if (classNames[j] == className) {
        elements.push(child);
        break;
      }
    }
  }
  return elements;
} 
Array.prototype.remove = function(v) {
    for (var i = 0; i < this.length; ++i) {
        if (this[i] == v) {
        this.splice(i, 1);
        return true;
        }
    }
    return false;
}

var Element = {
    show: function(elm) {
        if (elm != null) elm.style.display = '';
        },
      
    hide: function(elm) {
        if (elm != null) elm.style.display = 'none';
        },
        
    addClass: function(elm, name) {
        if (elm == null) return;
        var a = elm.className.split(/\s+/);
        var k = 0;
        for (var i = 1; i < arguments.length; ++i) {
            if (elm.className.indexOf(name) == -1) {
                a.push(arguments[i]);
                  k = 1;
               }
        }
    if (k) elm.className = a.join(' ');
    },

    removeClass: function(elm, name) {
        if (elm == null) return;
        var a = elm.className.split(/\s+/);
        var k = 0;
        for (var i = 1; i < arguments.length; ++i)
            k = a.remove(arguments[i]);
            if (k) elm.className = a.join(' ');
        },
    toggle: function(elm) {
            if (elm == null) return;
            elm.style.display = (elm.style.display != 'none' ? 'none' : '' );
        },
    remove: function(elm) {
            if (elm == null) return;
            elm.parentNode.removeChild(elm);
        },
	create: function(elm, obj) {
		var newElm = document.createElement(elm);
		return Object.extend(newElm, obj);
		},
   getPosition: function(elm) {
        var pX = 0;
        var pY = 0;
        while (elm != null) {
            pX += elm.offsetLeft;
            pY += elm.offsetTop;
            elm = elm.offsetParent;
            }
        return [pX, pY];
        }  
}

var Effect = {
    initialize: function() {
        
        },
    setOpacity: function(elm, opacity) {
        if (elm.filters) {
            elm.style.filter = 'alpha(opacity='+opacity+')';
            }
        else {
            elm.style.opacity = opacity / 100;
            }
        },
    setHeight: function(elm, height) {
        elm.style.height = height+'px';
        if (this.slideReset && height == 0) {Element.hide(elm)}
        },
        
    fadeOut: function(elm, obj) {
        this.time = 1800;
        this.color = '#f00';
        Object.extend(this,obj);
        elm.style.background = this.color;
        this.slide(elm, {
            opacStart: 100,
            opacEnd: 0,
            time: this.time,
            func: function(height) {
                this.setOpacity(elm, height);
                }
            });
        },
    fadeIn: function(elm, obj) {
        this.time = 1800;
        this.color = '#f00';
        Object.extend(this,obj);
        elm.style.background = this.color;
        this.slide(elm, {
            opacStart: 0,
            opacEnd: 100,
            time: this.time,
            func: function(height) {
                this.setOpacity(elm, height);
                }
            });
        }, 
    slideUp: function(elm, obj) {
        this.slideReset = true;
        Object.extend(this,obj);
        elm.style.height = 'auto';
        this.slideInit(elm, {
            opacStart: elm.offsetHeight,
            time: this.time
            });
        },
    slideDown: function(elm, obj) {
         this.slideReset = false;
         
         Element.show(elm);
         elm.style.visibility = 'hidden';
         elm.style.height = 'auto';
         elmHeight = elm.offsetHeight;
         elm.style.height = 0;
         Object.extend(this,obj);
         this.slideInit(elm, {
           opacEnd: elmHeight,
           time: this.time
           });
        },
        
    toggleSlide: function(elm) {
        if (elm.style.display != '') {
            this.slideDown(elm);
            elm.style.display = '';
            }
        else {
            this.slideUp(elm);
            elm.style.display = 'block';
            }
        },
    slideInit: function(elm, obj) {
        this.opacEnd = 0;
        this.opacStart = 0;
        this.setOpacity(elm, 100);
        Object.extend(this,obj);
        elm.style.overflow = 'hidden';
        //elm.style.height = 'auto';
        elm.style.display = 'block';
        elm.style.visibility = 'visible';
        this.slide(elm, {
            opacStart: this.opacStart,
            opacEnd: this.opacEnd,
            func: function(height) {
                this.setHeight(elm, height);
                }
            });
        },     
    slide: function(elm, obj) {
        this.time = 800;
        this.opacEnd = 0;
        this.opacStart = 0;
        Object.extend(this,obj);
        var self = this;
        var speed = Math.round(this.time / 100);
        var timer = 0;
        var pos = 0;
        if (this.opacStart > this.opacEnd) {
            for (i = this.opacStart; i >= this.opacEnd; i-=5) {
            if (i<5) i = 0;
                (function(){var pos = i;ta = setTimeout(function() {self.func(pos)},(timer * speed));timer++;})()
                }    
            }
        if (this.opacStart < this.opacEnd) {
            for (i = this.opacStart; i <+ this.opacEnd; i+=5) {
                (function(){ var pos = i;ta = setTimeout(function() {self.func(pos)},(timer * speed)); timer++; })()
                }    
            }    
        }   
}


db = new Object();
function iDrag(elm) {
	elm.onmousedown = Drag;
	}
function Drag(e) {
	//e = elm.event;
	elm = e.target;
	addEvent(this, 'mousemove', dragging);
	var elmPos = getPosition($(this.id));
	db.elmLeftPos = elmPos[0];
	db.elmTopPos = elmPos[1];
	var pos = getMousePosition(e);
	db.initMousePosLeft = pos[0];
	db.initMousePosTop = pos[1];
	}
function dragging(e) {
	elm = e.target;
	Effect.setOpacity(elm, 60);
	elm.style.cursor = 'move';
	pos = getMousePosition(e);
	elm.style.top = pos[1] + db.elmTopPos - db.initMousePosTop +'px';
	elm.style.left = pos[0] + db.elmLeftPos - db.initMousePosLeft +'px';
	elm.style.position = 'absolute';
	elm = this;
	addEvent(this, 'mouseup', stopDragging);
	}
function stopDragging() {
	var elm = this;
	Effect.setOpacity(elm, 100);
	elm.style.cursor = 'default';
	detachEvent(elm, 'mousemove', dragging);
	db.elmLeftPos = null;
	db.elmTopPos = null;
	db.initMousePosTop = null;
	db.initMousePosLeft = null;
	}
 
function Ajax() {
   this.options = {
      req: null,
   	url: null,
   	status: null,
		requestTimeout: 15000,
   	statusText: '',
   	method: 'GET',
   	async: true,
   	data: null,
   	readyState: null,
      evalScript: false,
   	responseText: null,
   	responseXML: null,
   	onComplete: function(){},
   	onSuccess: function(){},
      onError: function(){},
      onTimeout: function(){},
   	responseFormat: 'text',
   	mimeType: null,
      parameters:   ''
    }
    
   this.init = function() {
	    if (!this.req) {
			try {
				this.req = new XMLHttpRequest();
				}
			catch(e) {
				try {
					this.req = new ActiveXObject("Microsoft.XMLHTTP");
				}
				catch(e) {
					return false;
				}
			}
			return this.req;
		}
	};
   }

Ajax.Request = Class.create();
Ajax.Request.prototype = Object.extend(new Ajax(), {
   initialize: function(url, obj) {
      Object.extend(this, this.options || {});
      this.url = url;
      this.data = null;
      this.onError = function(status) {
         if(status == 0) {this.onComplete(resp); return}
			logger('error');
         return;
         }
      Object.extend(this, obj);
      this.open(this.url);
		
      },
   open: function(url) {
		
      var self = null;
		var req = null;
      if(!this.init()) {
			logger('Problem z XMLHttpRequest');
			return;
		}
      req = this.req;
      req.open(this.method, url, this.async);
      if (this.method == "POST") {
			req.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
         }
      self = this;
		
		rt = setTimeout(function() {
			req.abort();
			self.onTimeout();
			}, self.requestTimeout);
		
      req.onreadystatechange = function() {
      self.readyState = req.readyState;
			if(req.readyState == 4) {
				clearTimeout(rt);
				self.responseText = req.responseText;
				resp = self.responseText;
				try {
					if ((req.status > 199 && req.status < 300)|| (req.status == 304)) {
						//console.log('self.evalScript: '+self.evalScript);
	               if (self.evalScript) findAllScripts(resp);
	               self.onSuccess(resp);
	               self.onComplete(resp);
	               }
					else { 
						self.onError();
						}
					} catch (e) {}
			}
			else {
				
			}
			
	
         }
         this.req.send(this.data);
      }
      
   })
   
Ajax.Load = Class.create();
Object.extend(Object.extend(Ajax.Load.prototype, Ajax.Request.prototype), {
   initialize: function(url, elm, obj) {
      Object.extend(this, this.options || {});
      this.onSuccess = function(resp) {
         $(elm).innerHTML = resp;
         }
      this.onError = function(status) {
			logger('error');
         }
      Object.extend(this, obj);
      this.open(url);
      }
   })

   
function findAllScripts(script) {
   scriptsArray = [];
   var str = new RegExp('(?:<script.*?>)((\n|\r|.)*?)(?:<\/script>)', 'gi');
   scriptsArray = script.match(str);
   if (!scriptsArray) return;
   for (i=0; i<scriptsArray.length; i++) {
      evalScripts(scriptsArray[i]);
      }
   }

function evalScripts(script) {
   findScript = [];
   str = '(?:<script.*?>)((\n|\r|.)*?)(?:<\/script>)';
   findScript = script.match(str);
   if(!findScript) return;
   script = findScript[1];
   var global_js = this;
   if (window.execScript) {
      window.execScript(script);
      return null;
      }
   return global_js.eval ? global_js.eval(script) : eval(script);
   }

function addEvent(elm, evType, fn, useCapture) {
	if (elm.addEventListener) {
		elm.addEventListener(evType, fn, useCapture);
		return true;
	}
	else if (elm.attachEvent) {
		var r = elm.attachEvent('on' + evType, fn);
		return r;
	}
	else {
		elm['on' + evType] = fn;
	}
}

function detachEvent(elm, evType, fn, useCapture) {
	if (elm.removeEventListener) {
		elm.removeEventListener(evType, fn, useCapture);
		return true;
	}
	else if (elm.attachEvent) {
		var r = elm.detachEvent('on' + evType, fn);
		return r;
	}
	else {
		elm['on' + evType] = fn;
	}
}

function getEventTarget(event) {
	var targetElement = null;
	if (typeof event.target != "undefined") {
		targetElement = event.target;
		}
	else {
		targetElement = event.srcElement;
		}

	while (targetElement.nodeType == 3 && targetElement.parentNode != null) {
		targetElement = targetElement.parentNode;
		}
	return targetElement;
}

function stopDefaultAction(event) {
	event.returnValue = false;
	if (typeof event.preventDefault != "undefined") {
		event.preventDefault();
		}
	return true;
}

function getScrollingPosition() {
	var position = [0, 0];
	if (typeof window.pageYOffset != 'undefined') {
    position = [
      window.pageXOffset,
      window.pageYOffset
      ];
	}
	if (typeof document.documentElement.scrollTop != 'undefined' && document.documentElement.scrollTop > 0) {
    position = [
      document.documentElement.scrollLeft,
      document.documentElement.scrollTop
      ];
	}

  else if (typeof document.body.scrollTop != 'undefined') {
    position = [
      document.body.scrollLeft,
      document.body.scrollTop
      ];
	}
	return position;
}

function getPosition(elm) {
	var positionX = 0;
	var positionY = 0;
	while (elm != null) {
		positionX += elm.offsetLeft;
		positionY += elm.offsetTop;
		elm = elm.offsetParent;
		}

	return [positionX, positionY];
}

function getMousePosition(evt) {
	var pos = [];
	if (typeof evt.pageX != "undefined") {
		pos[0] = evt.pageX;
		pos[1] = evt.pageY;
		}
	else {
		var scrollPos = getScrollingPosition();
		pos[0] = evt.clientX + scrollPos[0];
		pos[1] = evt.clientY + scrollPos[1];
		}
	return pos;
	}
function getViewportSize() {
	var size = [0, 0];
	if (typeof window.innerWidth != 'undefined') {
		size = [
			window.innerWidth,
			window.innerHeight
		];
	} 	else if (typeof document.documentElement != 'undefined'
			&& typeof document.documentElement.clientWidth != 'undefined'
			&& document.documentElement.clientWidth != 0) {
		size = [
			document.documentElement.clientWidth,
			document.documentElement.clientHeight
		];
	}
	else {
		size = [
			document.getElementsByTagName('body')[0].clientWidth,
			document.getElementsByTagName('body')[0].clientHeight
		];
	}
	return size;
}

function Create(){};
Create.sortList = Class.create();
Create.sortList.prototype = {
   initialize: function(listID, obj) {
      this.onComplete = function(){};
      Object.extend(this, obj);
      var list = $(listID).getElementsByTagName('li');
      for (i=0; i<list.length; i++) {
         var self = this;
         list[i].onmousedown = function(event){
            self.initSortList(event);
            };
         }
      },
   initSortList: function(event) {
      if (typeof event == "undefined") event = window.event;
      if (typeof event.pageY == "undefined") event.pageY = event.clientY + getScrollingPosition()[1];
      var target = getEventTarget(event);
      
      while (target.nodeName.toLowerCase() != "li") {
         target = target.parentNode;
         }
      document.currentTarget = target;
      target.clickOriginY = event.pageY;
      var self = this;
      document.onmousemove = function(event) {
         self.mousemoveCheckThreshold(event);
         }
      document.onmouseup = function(event) {
         self.mouseupSortableList(event);
         }
      stopDefaultAction(event);
      
      return true;
      },
   mousemoveCheckThreshold: function(event) {
      if (typeof event == "undefined") event = window.event;
      if (typeof event.pageY == "undefined") event.pageY = event.clientY + getScrollingPosition()[1];
      var target = document.currentTarget;
      if (Math.abs(target.clickOriginY - event.pageY) > 3) {
      var self = this;
      document.onmousemove = function(event) {
         self.mousemoveSortableList(event);
         }
      document.onmouseup = function(event) {
         self.mouseupSortableList(event);
         }

      var cloneItem = target.cloneNode(true);
       cloneItem.setAttribute("class", "clone");
       cloneItem.style.position = "absolute";
       cloneItem.style.top = getPosition(target)[1] + "px";
       cloneItem.differenceY = parseInt(cloneItem.style.top) - event.pageY;

      cloneItem = target.parentNode.appendChild(cloneItem);
      cloneItem.style.cursor = 'move';
      target.clone = cloneItem;
      if (window.attachEvent) {
   		pos = getPosition(target);
   		cloneItem.style.left = pos[0]+'px';
		}
      target.style.visibility = "hidden";
      }
      stopDefaultAction(event);
      return true;
   },

   mousemoveSortableList: function (event) {
      if (typeof event == "undefined") event = window.event;
      if (typeof event.pageY == "undefined") event.pageY = event.clientY + getScrollingPosition()[1];

   	var target = document.currentTarget;
   	var clone = target.clone;
   	var plannedCloneTop = event.pageY + clone.differenceY;
   	var listItems = clone.parentNode.getElementsByTagName("li");
   	var firstItemPosition = getPosition(listItems[0]);
   	var lastItemPosition = getPosition(listItems[listItems.length - 2]);

      if (plannedCloneTop < firstItemPosition[1]) {
         plannedCloneTop = firstItemPosition[1];
         }
      else if (plannedCloneTop > lastItemPosition[1]) {
         plannedCloneTop = lastItemPosition[1];
         }

   	clone.style.top = plannedCloneTop + "px";
   	var LIs = target.parentNode.getElementsByTagName("li");
   	var currentItemHigher = true;

   	for (var i = 0; i < LIs.length; i++) {
   		if (LIs[i] != target && LIs[i] != target.clone) {
   			if (event.pageY < getPosition(LIs[i])[1] + LIs[i].offsetHeight && currentItemHigher) {
   				target.parentNode.insertBefore(target, LIs[i]);
   				break;
   			}
   		else if (event.pageY > getPosition(LIs[i])[1] && !currentItemHigher) {
   			target.parentNode.insertBefore(LIs[i], target);
   			}
   		}
   		else {
   			currentItemHigher = false;
      			}
   	}

   	stopDefaultAction(event);

   	return true;
      },
   
   mouseupSortableList: function() {
      Object.extend(this, Create.initialize); 
   	var target = document.currentTarget;
   	try {
         var clone = target.clone;
         clone.parentNode.removeChild(clone);
         this.onComplete(target);
         } catch(e){}

   	target.style.visibility = "visible";
   	document.onmousemove = null;
   	document.onmouseup = null;
      
      
   }
}