/**
 * shaker init
 * Copyright (c) IT Cocktail oHG | http://www.it-cocktail.com
 */
;(function( $ ){

String.prototype.pad = function(l, s, t){
    return s || (s = " "), (l -= this.length) > 0 ? (s = new Array(Math.ceil(l / s.length)
        + 1).join(s)).substr(0, t = !t ? l : t == 1 ? 0 : Math.ceil(l / 2))
        + this + s.substr(0, l - t) : this;
};

jQuery.fn.comment = function( value ){
	var comment = null;
 
	// Loop over each node to search its children for
	// comment nodes and element nodes (if deep search).
	this.each(
		function( index, domElement ){
			var childnode = domElement.firstChild;
			
			// Keep looping over the top-level children
			// while we have a node to examine.
			while (childnode && comment == null){
 				
				// Check to see if this node is a comment.
				if (childnode.nodeType === 8 && childnode.nodeValue == value){
					
					// We found a comment node. Add it.
					comment = childnode;
 
				} else if (childnode.nodeType === 1) {

					// Traverse this node deeply.
					comment = $(childnode).comment(value);
 
				}
 
				// Move to the next sibling.
				childnode = childnode.nextSibling;
 
			}
			
		}
		);
	// Return the comment
	return comment;
}	

	
	
//jQuery prototypes

$.Event.prototype.checkModifier =  function(modifier) {
    var ret = true;
    var e = this.originalEvent;
    
    if (e) {
	    if (!modifier) modifier = '';
	    ret = (ret && ((modifier.search(/ALT/) == -1) ? !e.altKey : e.altKey));
	    ret = (ret && ((modifier.search(/CTRL/) == -1) ? !e.ctrlKey : e.ctrlKey));
	    ret = (ret && ((modifier.search(/SHIFT/) == -1) ? !e.shiftKey : e.shiftKey));
	    ret = (ret && ((modifier.search(/META/) == -1) ? !e.metaKey : e.metaKey));
	
	    button = null;
	    if (typeof(e.button) != 'undefined') {
	        if (typeof(e.which) == 'undefined') {
	            /* IE case */
	            button = (e.button == 1 || e.type == "click" || e.type == "dblclick") ? "LEFT" : ((e.button == 4) ? "MIDDLE" : ((e.button == 2 || e.type == "contextmenu") ? "RIGHT" : null));
	        } else {
	            /* All others */
	            button = (e.which < 2) ? "LEFT" : ((e.which == 2) ? "MIDDLE" : "RIGHT");
	        }
	    }
	    ret = (ret && ((modifier.search(/MB_LEFT/) == -1) ? button == null || (button != 'LEFT') : (button != null && button == 'LEFT')));
	    ret = (ret && ((modifier.search(/MB_MIDDLE/) == -1) ? button == null || (button != 'MIDDLE') : (button != null && button == 'MIDDLE')));
	    ret = (ret && ((modifier.search(/MB_RIGHT/) == -1) ? button == null || (button != 'RIGHT') : (button != null && button == 'RIGHT')));
    }
    
    return ret;
}


// jQuery custom events

$.event.returnPressHandler = function (e) {
    var event;
	if (e.originalEvent.keyCode == 13) {
    	event = $.Event(e.originalEvent);
        event.type = 'returnpress';
        event.target = e.target;
        event.currentTarget = e.currentTarget;
        event.originalTarget = e.originalTarget;
        event.pageX = e.pageX;
        event.pageY = e.pageY;
        $.event.handle.call(this, event);
    }
}

$.event.special.returnpress = {
    setup: function(data) {
        $.event.add(this, 'keypress.returnpress', $.event.returnPressHandler, data);
    },
    teardown: function() {
        $.event.remove(this, 'keypress.returnpress', $.event.returnPressHandler);
    }
}


$.fn.bindLocal = function(type, options, handler) {
    var opt = $.extend({
                modifier: '',
                handler: handler
            }, options);
    
    return this.each(function() {
        $(this).bind(type, opt, $.event.localHandler);
        
        var events = jQuery.data(this, "events") || jQuery.data(this, "events", {});
        var sortedTypeHandlers = [];
        
        
        for ( var j in events[type] ) {
            var handler = events[type][j];

            // Sort handlers
            if ( handler.data  && handler.data.postback ) {
                sortedTypeHandlers.push(handler);
            } else {
                sortedTypeHandlers.unshift(handler);
            }
        }
        events[type] = {};

        for ( var j in sortedTypeHandlers ) {
            var handler = sortedTypeHandlers[j];
            events[type][handler.guid] = handler;
        }
        
        events[type] = sortedTypeHandlers;
        jQuery.data(this, "events", events);
    });
}


$.fn.bindPostback = function (type, options) {
    var opt = $.extend({
                ajax: false,
                modifier: '',
                async: true,
                postback: true
            }, options);
    
    
    return this.each(function() {
        $(this).bind(type, opt, $.event.postbackHandler);
    });
}

$.event.localHandler = function(e) {
    if (e.data.modifier == '' || e.checkModifier(e.data.modifier)) {
        return e.data.handler.call(this, e);
    }
}

$.event.postbackHandler = function(e) {
	if (e.data.modifier == '' || e.checkModifier(e.data.modifier)) {
    	if (e.type == 'returnpress') e.preventDefault();
        if (e.target.tagName &&
        	e.target.tagName.toLowerCase() != "input" &&
            e.target.tagName.toLowerCase() != "textarea" &&
            e.target.tagName.toLowerCase() != "select" &&
            e.target.tagName.toLowerCase() != "button"
           ) e.preventDefault();
    
        var shakerTarget = (e.target ? e.target: e.originalTarget);
        while (!shakerTarget.id && shakerTarget.parentNode) { shakerTarget = shakerTarget.parentNode; }
    
        var form = $('form').get(0);
        if (e.target == document) {
            form.shaker_event_widget.value = 'page';
        } else if (this.id) {       
            form.shaker_event_widget.value = this.id;
        } else {
            form.shaker_event_widget.value = '';
        }
        if (shakerTarget && shakerTarget.id) {
            form.shaker_target_widget.value = shakerTarget.id;
        } else {
            form.shaker_target_widget.value = '';
        }
        form.shaker_event.value        = e.type + (e.data.modifier == '' ? '' : '|' + e.data.modifier);
        form.shaker_page_posx.value    = $(document).scrollLeft();
        form.shaker_page_posy.value    = $(document).scrollTop();

        form.shaker_mouse_posx.value   = (e.pageX ? e.pageX : '');
        form.shaker_mouse_posy.value   = (e.pageY ? e.pageY : '');

        if (e.data.ajax == false) {
            form.submit();
        } else {
            $.shaker.ajax.showLoader();
            $.ajax({
            	url: $.shaker.ajax.url,
            	type: 'POST',
            	data: $.shaker.getQueryString(),
            	complete: $.shaker.ajax.hideLoader,
            	dataType: 'script',
            	async: e.data.async
            });
        }
    }
}


$.shaker = {
    ajax: {},
    debug: false,
    effects: {},
    widgets: {},
    webroot: '/'
};

$.shaker.getSelectedOptions = function(select) {
    var options = select.options;
    var option = null;
    var qs = "";
    var tempString = "";

    for(var x = 0; x < options.length; x++) {
        tempString = "";
        option = options[x];

        if(option.selected) {
            tempString = select.name + "=" + encodeURIComponent(option.value);
        }

        if(tempString != "") {
            if(qs == "") {
                qs = tempString;
            }
            else {
                qs = qs + "&" + tempString;
            }
        }
    }
    return qs;
};

$.shaker.getQueryString = function(form) {
    var elements = (form ? form.elements : document.forms[0].elements);
    var node = null;
    var qs = "";
    var name = "";

    var tempString = "";
    for(var i = 0; i < elements.length; i++) {
        tempString = "";
        node = elements[i];
        name = node.getAttribute("name");

        //use id if name is null
        if (!name) {
            name = node.getAttribute("id");
        }

        if(node.tagName.toLowerCase() == "input") {
            if(node.type.toLowerCase() == "radio" || node.type.toLowerCase() == "checkbox") {
                if(node.checked) {
                    tempString = name + "=" + node.value;
                }
            }

            if(node.type.toLowerCase() == "text" || node.type.toLowerCase() == "hidden" || node.type.toLowerCase() == "password") {
                tempString = name + "=" + encodeURIComponent(node.value);
            }
        }
        else if(node.tagName.toLowerCase() == "select") {
            tempString = $.shaker.getSelectedOptions(node);
        }

        else if(node.tagName.toLowerCase() == "textarea") {
            tempString = name + "=" + encodeURIComponent(node.value);
        }

        if(tempString != "") {
            if(qs == "") {
                qs = tempString;
            }
            else {
                qs = qs + "&" + tempString;
            }
        }

    }
    return qs;
};


$.shaker.replace = function(id, outerHTML, replaceComplete, replaceEffect, replaceParamsOut, replaceParamsIn) {
	var comment = false;
    var elem = document.getElementById(id);

	if (!elem) {
		elem = $('body').comment(id);
		comment = true;
	}

	if (!elem) {
		alert('Element #'+id+' not found');
		return;
	}
	
	// Head workaround
    if (elem.nodeName == 'HEAD') {
        document.location.reload();
    } else {
    	if (replaceEffect == 'domReplaceFade' && ($.shaker.effects.active & $.shaker.effects.list[replaceEffect])) {
            if (comment == true) {
            	if (outerHTML != '<!--'+id+'-->') {
            		$(elem).replaceWith(outerHTML).fadeIn('normal');
            	}
                replaceComplete();
            } else {
	        	$(elem).fadeOut('normal', function() {
	        		if (outerHTML == '<!--'+id+'-->') {
	            		var outerElem = document.createComment(id);
                        $(elem).replaceWith(outerElem); 
	        		} else {
                        outerHTML = $(outerHTML);
                        if(outerHTML.css('display') == 'none') {
                            outerHTML.replaceAll(elem);
                        } else {
                            outerHTML.css('display', 'none').replaceAll(elem).fadeIn('normal').show();
                        }
	        		}
	                replaceComplete();
	            });
            }
    	} else if (replaceEffect == 'domReplaceSlide' && $.shaker.effects.active & $.shaker.effects.list[replaceEffect]) {
            if (comment == true) {
            	if (outerHTML != '<!--'+id+'-->') {
            		$(elem).replaceWith(outerHTML).slideDown('normal');
            	}
                replaceComplete();
            } else {
	        	$(elem).slideUp('normal', function() {
	        		if (outerHTML == '<!--'+id+'-->') {
	            		var outerElem = document.createComment(id);
                        $(elem).replaceWith(outerElem);
	        		} else {
                        outerHTML = $(outerHTML);
                        if(outerHTML.css('display') == 'none') {
                            outerHTML.replaceAll(elem);
                        } else {
                            outerHTML.css('display', 'none').replaceAll(elem).slideDown('normal').show();
                        }
	        		}
	                replaceComplete();
	            });
            }
    	} else if (replaceEffect == 'domReplaceAnimate' && $.shaker.effects.active & $.shaker.effects.list[replaceEffect]) {
            if (comment == true) {
            	if (outerHTML != '<!--'+id+'-->') {
            		$(elem).replaceWith(outerHTML).animate(replaceParamsIn, 'normal');
            	}
                replaceComplete();
            } else {
	        	$(elem).animate(replaceParamsOut, 'normal', 'swing', function() {
	        		if (outerHTML == '<!--'+id+'-->') {
	            		var outerElem = document.createComment(id);
                        $(elem).replaceWith(outerElem);
	        		} else {
                        outerHTML = $(outerHTML);
                        if(outerHTML.css('display') == 'none') {
                            outerHTML.replaceAll(elem);
                        } else {
    		        		outerHTML.css(replaceParamsOut).replaceAll(elem).animate(replaceParamsIn, 'normal');
                        }
	        		}
	                replaceComplete();
	            });
            }
    	} else {
    		if (comment == true) {
            	if (outerHTML != '<!--'+id+'-->') {
            		$(elem).replaceWith(outerHTML);
            	}
                replaceComplete();
            } else {
	        	if (outerHTML == '<!--'+id+'-->') {
	        		var outerElem = document.createComment(id);
	                $(elem).replaceWith(outerElem);
	        	} else {
	        		$(elem).replaceWith(outerHTML);
	        	}
	        	replaceComplete();
            }
        }
    }
};


$.shaker.hide = function(id) {
	if ($.shaker.effects.active & $.shaker.effects.list.domHideFade) {
		$('#'+id).fadeOut('normal');
	} else {
        $('#'+id).hide();
	}	
};


$.shaker.show = function(id) {
	if ($.shaker.effects.active & $.shaker.effects.list.domShowFade) {
        $('#'+id).fadeIn('normal');
    } else {
        $('#'+id).show();
	}
};


$.shaker.addVML = function () {
    if (!document.namespaces) return;

    for(var i =0; i< document.namespaces.length; i++)
    {
        if (document.namespaces(i).name=='v' ) return;
    }
    document.namespaces.add('v', 'urn:schemas-microsoft-com:vml');
};



//Javascript Effects

$.shaker.effects.active = 0;
$.shaker.effects.list = {
	'none': 0,
    'domReplaceFade': 1,
	'domHideFade': 2,
	'domShowFade': 4,
	'domPulse': 8,
	'domReplaceSlide': 16,
	'domReplaceAnimate': 32
};


// Allgemeine funktionen
$.shaker.debug = false;

$.shaker.init = function(windowname, activeEffects, webroot) {
    var form = $('form').get(0);
    window.scrollTo(form.shaker_page_posx.value, form.shaker_page_posy.value);
    
    window.name = windowname;
    for (i=0; i<activeEffects.length; i++) {
    	$.shaker.effects.active = $.shaker.effects.active | $.shaker.effects.list[activeEffects[i]];
    }
    $(document).bind('keydown', $.shaker.showDebugConsole);
    $(document).bind('click', $.shaker.inhibitMiddleClick);
    
    $.shaker.webroot = webroot;
};

$.shaker.inhibitMiddleClick = function(e) {
    if (e.checkModifier("MB_MIDDLE") || e.checkModifier("CTRL|MB_LEFT") || e.checkModifier("CTRL|MB_MIDDLE")) {
    	var inhibit = true;
    	if (e.target.nodeName == 'A' && e.target.getAttribute('href').match(/^[^:]*:/) != null) inhibit = false;
    	if (e.target.parentNode.nodeName == 'A' && e.target.parentNode.getAttribute('href').match(/^[^:]*:/) != null) inhibit = false;
    		
    	if (inhibit == true) {
    		e.stopPropagation();
	        e.preventDefault();
		}
	}
};

$.shaker.showDebugConsole = function(e) {
    if (e.checkModifier("CTRL|SHIFT") && e.keyCode == 68 /* CTRL+SHIFT+D */) {
		$.shaker.buildDebugConsole().toggle();
        e.preventDefault();
	}
};


$.shaker.buildDebugConsole = function() {
    var debugDIV = $('#shaker_debug');
	
    if (debugDIV.size() == 0) {
    	debugDIV = $('<div/>')
            .attr('id', 'shaker_debug')
            .css({
                'position': 'absolute',
                'left': 0,
                'bottom': 0,
                'width': '100%',
                'height': '200px',
                'overflow': 'auto',
                'color': '#0f0',
                'background-color': '#000',
                'text-align': 'left',
                'z-index': '95'
            })
            .hide()
            .appendTo('body:first')
            .bind('dblclick', function(e) {
    	        debugDIV.hide();
                e.stopPropagation();
                e.preventDefault();
	   	    })
            .bind('contextmenu', function(e) {
    	        debugDIV.html('');
    			e.stopPropagation();
                e.preventDefault();
	   	    });
	}

	return debugDIV;
};


$.shaker.debuglog = function(text, type) {
	if (typeof(window.console) != 'undefined' && typeof(window.console.firebug) != 'undefined') {
		if (type=='error') {
			window.console.error(text);
		} else if (type=='ajax') {
			/* do nothing because it will be logged separately in Firebug */
		} else {
			window.console.info(text);
		}
	} else {
		if (typeof(text) == 'string') {
            text = text.replace(/&/g, '&amp;');
    		text = text.replace(/</g, '&lt;');
    		text = text.replace(/>/g, '&gt;');
    		text = text.replace("\n", "<br />\n");
        } else if (typeof(text) == 'object') {
        	text = $.shaker.serializeObject(text);
        }

		if (type=='error') {
			style = 'color: #f00';
		} else if (type=='ajax') {
			style = 'color: #fff';
		} else {
			style = 'color: #0f0';
		}
		var html = $.shaker.buildDebugConsole().html();
		html += '<p style="' + style + '">' + text + '</p><hr />';
		var dc = $.shaker.buildDebugConsole().html(html);
		if ($.shaker.debug == true) dc.show();
	}
};

$.shaker.serializeObject = function(obj, indentValue)
{
  var hexDigits = "0123456789ABCDEF";
  function ToHex(d)
  {
    return hexDigits[d >> 8] + hexDigits[d & 0x0F];
  }
  function Escape(string)
  {
    return string.replace(/[\x00-\x1F'\\]/g,
        function (x)
        {
          if (x == "'" || x == "\\") return "\\" + x;
          return "\\x" + ToHex(String.charCodeAt(x, 0));
        })
  }

  var indent;
  if (indentValue == null)
  {
    indentValue = "";
    indent = ""; // or " "
  }
  else
  {
    indent = "\n";
  }
  return GetObject(obj, indent).replace(/,$/, "");

  function GetObject(obj, indent)
  {
    if (typeof obj == 'string')
    {
      return "'" + Escape(obj) + "',";
    }
    if (obj instanceof Array)
    {
      result = indent + "[";
      for (var i = 0; i < obj.length; i++)
      {
        result += indent + indentValue +
            GetObject(obj[i], indent + indentValue);
      }
      result += indent + "],";
      return result;
    }
    var result = "";
    if (typeof obj == 'object')
    {
      result += indent + "{";
      for (var property in obj)
      {
        result += indent + indentValue + "'" +
            Escape(property) + "' : " +
            GetObject(obj[property], indent + indentValue);
      }
      result += indent + "},";
    }
    else
    {
      result += obj + ",";
    }
    return result.replace(/,(\n?\s*)([\]}])/g, "$1$2");
  }
}


	

//Ajax
$.shaker.ajax = {};

$.shaker.ajax.url = '';
$.shaker.ajax.keepaliveUrl = '';
$.shaker.ajax.keepaliveInterval = '';
$.shaker.ajax.loaderCnt = 0;
$.shaker.ajax.dialog;
$.shaker.ajax.pageX = 0;
$.shaker.ajax.pageY = 0;




$.shaker.ajax.init = function(url, loaderUrl, keepaliveUrl, keepaliveInterval) {
		$.shaker.ajax.url = url;
		
		$('<img/>')
            .attr('id', 'AJAXLoader')
            .attr('src', loaderUrl)
            .css({
                'position': 'absolute',
                'z-index': 1001
            })
            .hide()
            .appendTo('body');
		
		if (keepaliveUrl != '' && keepaliveInterval != '') {
			$.shaker.ajax.keepaliveUrl = keepaliveUrl;
			$.shaker.ajax.keepaliveInterval = keepaliveInterval * 1000;
			window.setTimeout('$.shaker.ajax.keepalive()', $.shaker.ajax.keepaliveInterval);
		}
		
		$(document).bind('mousemove.pagepos', function(e) {
			$.shaker.ajax.pageX = e.pageX;
			$.shaker.ajax.pageY = e.pageY;
		});		
};

$.shaker.ajax.keepalive = function() {
	if ($.shaker.ajax.keepaliveUrl != '') {
		$.post($.shaker.ajax.keepaliveUrl, '', null, 'script'); 
	}
};

$.shaker.ajax.showLoader = function() {
	$.shaker.ajax.loaderCnt++;
	if ($.shaker.ajax.loaderCnt==1) {
		$.shaker.ajax.setLoader();
		$(document).bind('mousemove.loader', function(e) {
			$.shaker.ajax.setLoader();
		});
	}
};

$.shaker.ajax.hideLoader = function() {
	if ($.shaker.ajax.loaderCnt>0) $.shaker.ajax.loaderCnt--;
	if ($.shaker.ajax.loaderCnt==0) {
		$('#AJAXLoader').hide();
        $(document).unbind('mousemove.loader');
	}
};

$.shaker.ajax.setLoader = function() {
	var x = $.shaker.ajax.pageX;
	var y = $.shaker.ajax.pageY;
	
	if (x>0 && y>0) {
		$('#AJAXLoader').css({
            'left': (x + 20) + 'px',
            'top': (y + 20) + 'px'
        }).show();
	}
};


$.shaker.ajax.alert = function(message, title) {
    $('<div>' + message + '</div>')
        .appendTo('body')
        .dialog({
            title: title,
            modal: true,
            resizable: false,
            minHeight: 0,
            buttons: {
                "OK": function() {
                    $(this).dialog('close');
                }
            },
            close: function(e, ui) {
                $(this).dialog('destroy').remove();
            }
        });
};

$.shaker.ajax.confirm = function(message, event, title, okCaption, cancelCaption) {
    var options = {
        title: title,
        modal: true,
        resizable: false,
        minHeight: 0,
        buttons: {},
        close: function(e, ui) {
            $(this).dialog('destroy').remove();
        }
    }
    options.buttons[okCaption] = function() {
        evt = $.Event(event+'-ok');
        evt.target = document;
        evt.data = {
            ajax: true,
            modifier: ''
        }
		console.log($(this).dialog('widget').children('.ui-dialog-content'));
        $.event.postbackHandler(evt);
        $(this).dialog('close');
    };
    options.buttons[cancelCaption] = function() {
        evt = $.Event(event+'-cancel');
        evt.target = document;
        evt.data = {
            ajax: true,
            modifier: ''
        }
        $.event.postbackHandler(evt);
        $(this).dialog('close');
    };
    
    $('<div>' + message + '</div>')
        .appendTo('body')
        .dialog(options);
};

})( jQuery );
