/**
 * @author steffen
 */
function URLEncode(url) //Function to encode URL.
{
// The Javascript escape and unescape functions do not correspond
// with what browsers actually do...
var SAFECHARS = "0123456789" + // Numeric
"ABCDEFGHIJKLMNOPQRSTUVWXYZ" + // Alphabetic
"abcdefghijklmnopqrstuvwxyz" +
"-_.!~*'()"; // RFC2396 Mark characters
var HEX = "0123456789ABCDEF";

var plaintext = url;
var encoded = "";
for (var i = 0; i < plaintext.length; i++ ) {
var ch = plaintext.charAt(i);
if (ch == " ") {
encoded += "+"; // x-www-urlencoded, rather than %20
} else if (SAFECHARS.indexOf(ch) != -1) {
encoded += ch;
} else {
var charCode = ch.charCodeAt(0);
if (charCode > 255) {
alert( "Unicode Character '"
+ ch
+ "' cannot be encoded using standard URL encoding.\n" +
"(URL encoding only supports 8-bit characters.)\n" +
"A space (+) will be substituted." );
encoded += "+";
} else {
encoded += "%";
encoded += HEX.charAt((charCode >> 4) & 0xF);
encoded += HEX.charAt(charCode & 0xF);
}
}
}

return encoded;
}; 
    function quote_id(s) {
        return s.replace(/\./g, '\\.');
    }

    var field_re = /(\w+)(?:-(or|and))?(\.\d+)?(\.\d+)?\.([\w\._-]+)$/
    var activeKind = null;
    var tmp_attr_selection = {};

    function getKinds() {
        return jQuery.map(jQuery('#popup_kinds li a'), function (elt) {
            return elt.id.match(/popup_li_(.*)/)[1]});
    }

	function toggleKind(mode,kindID) {
		jQuery('#'+mode+'_kinds li a').removeClass('selected');
        jQuery('#'+mode+'_li_'+quote_id(kindID)).addClass('selected');
       
		jQuery('#'+mode+'_attributeList > div.'+mode+'_kind').hide();
        jQuery('#'+mode+'_kind_'+quote_id(kindID)).show();
        if (mode == 'popup') {
			activeKind = kindID;
            attrSearch('');
        }
		jQuery('#popupKinds div.popupKindsSearch').fadeIn(200);
	}

	function searchbarSubmit( value ) {
		jQuery('#attrSearchCB').val(value);
		kind = activeKind;		
		var terms = tmp_attr_selection[kind];
        if (!terms)
            tmp_attr_selection[kind] = terms = [];
        var i = jQuery.inArray(value, terms);
        terms.push(value);       
		attr_submitSearch();		
	}

    function attr_submitSearch() {
        if (!attr_haveTmpQuery()) return;
        var query = getQuery();
        tb_remove();
        window.location.href = getURLAddress() + '?' + query;
    }

    function attr_select(element, kind) {
        var terms = tmp_attr_selection[kind];
        if (!terms)
            tmp_attr_selection[kind] = terms = [];
        var i = jQuery.inArray(element.value, terms);
        if (element.checked) {
            if (i < 0) terms.push(element.value);
        } else if (i >= 0) {
            tmp_attr_selection[kind] = terms.slice(0,i).concat(terms.slice(i+1));
        }
        if (attr_getTmpQuery().length) {
            jQuery('#tb_submit').show();
        } else {
            jQuery('#tb_submit').hide();
        }
    }

    function attr_updateSelection(kind) {
        var terms = tmp_attr_selection[kind];
        if (!terms || !terms.length) return;
        jQuery('#popup_kind_ul_'+quote_id(kind)+" input[type='checkbox']").attr(
            'checked', function (i) {return jQuery.inArray(this.value, terms) >= 0});
    }

    function attr_parseQuery(query) {
        var res = [];
        var rem = {};
        jQuery.each(tb_parseQuery(query), function (k, v) {
            var field = k.match(field_re);
            if (field == null) {
                rem[k] = v;
                return;
            };
            res.push({
                prefix: field[1],
                name: field[5],
                position: field[3] ? parseInt(field[3].substring(1)) : 0,
                group: field[4] ? field[3] : field[3],
                value: v,
                op: field[1] ? field[1] : ''})
        });
        return [res, rem];
    }

    function attr_haveTmpQuery(omit) {
        var kinds = getKinds();
        for (var i=0; i<kinds.length; i++) {
            var terms = tmp_attr_selection[kinds[i]];
            if (terms && terms.length) return true;
        }
        return false;
    }

    function attr_getTmpQuery(prefix, position, omit) {
        var res = [];
        if (!position) position = 0;
        jQuery.each(getKinds(), function (i, kind) {
            if (kind == omit) return;
            var group = position;
            var terms = tmp_attr_selection[kind];
            if (!terms || !terms.length) return;
            res = res.concat(jQuery.map(terms, function (v) {
                return {prefix: prefix, name: kind, position: position++, group: group, value: v, op: 'or'}}));
        });
        return res;
    }

    function attr_compileQuery(query) {
        param = {};
        jQuery.each(query, function (i, clause) {
            var name = clause.prefix;
            if (clause.op)
                name += '-' + clause.op;
            name += '.' + clause.position;
            if (clause.position != clause.group)
                name += '.' + clause.group;
            name += '.' + clause.name;
            param[name] = clause.value;
        });
        return jQuery.param(param);
    }

    function attr_getMaxPosition(query) {
        if (!query.length) return -1;
        return Math.max.apply(Math, jQuery.map(query, function (clause) {return clause.position}));
    }

    function removeFilter(removeTerm,removeKind,replaceTerm) { 
        
        url = document.URL;
        urlSplitted = url.split('?');
        urlParameter = urlSplitted[1].split('&');
        
        newUrl = urlSplitted[0] + '?';
        var once = 0;
    
        for (i=0;i<urlParameter.length;i++) {
            if (replaceTerm && replaceTerm.indexOf('q.ab') == 0 && urlParameter[i].indexOf('q.ab') == 0) {
                if (!once++) {
                    newUrl = newUrl + '&' + replaceTerm;
                }
            } else if (removeTerm && urlParameter[i] != removeTerm) {
                newUrl = newUrl + '&' + urlParameter[i];
            }
            
            if (removeKind != false) {
            
                urlParameterSplitted = urlParameter[i].split('=');
                urlParameterDef = urlParameterSplitted[0].split('.');
                
                if (urlParameterDef[1] != removeKind) {
                    newUrl = newUrl + '&' + urlParameter[i];
                }
            
            }
            
        }
        window.location.href = newUrl;
    }

    function addFilter(term) {
        urlParams = getQuery();
        tb_remove();

        // Neuen Filter anhaengen
        (urlParams == '') ?
            urlParams = term :
            urlParams = urlParams.replace(/b_start=\w*&?/, '') + '&' + term;

        
        window.location.href = getURLAddress() + '?' + urlParams;
    }
       
    function attrResort(kind,sortby,object) {
        (sort[kind][sortby] == 'asc') ? sort[kind][sortby] = 'desc' : sort[kind][sortby] = 'asc';
        sort[kind]['current'] = sortby;
        
        string = jQuery('#attrSearch_'+quote_id(kind)).val();
        sortdir = sort[kind][sortby];
        uri = getAttrSearchRequest(kind,string,sortby,sortdir);
        jQuery('#popup_kind_ul_'+quote_id(kind)).load(uri);
    }

    function attrSearch(string) {
        //~ sortby = sort[kind]['current'];
        //~ sortdir = sort[kind][sortby];
        uri = getAttrSearchRequest(activeKind,string);
        jQuery('#popup_kind_ul_'+quote_id(activeKind)).load(uri, function() {			
			if(parseInt(jQuery('#popup_kind_ul_'+quote_id(activeKind) + ' > #tb_popup_has_more').val()) == 1 ) {
				jQuery('#tb_search_hint').show();
			} else {
				jQuery('#tb_search_hint').hide();
			}			
            attr_updateSelection(activeKind);
		});
    } 
    
    function getAttrSearchRequest(kind,string,sortby,sortdir) {
		uri = '../attrsearch.html';
		if(typeof(overrideAttrSearchURL) != 'undefined') uri = overrideAttrSearchURL;
		string = string.replace('&', ' ');
        uri += '?query='+encodeURIComponent(getQuery(kind));
        uri += '&kind='+kind;
        uri += '&string='+encodeURI(string);
        if (typeof(initField) != "undefined") {
            uri += '&field='+initField;
        }
		uri += '&_=' + (new Date).getTime();
        //~ uri += '&sortby='+sortby;
        //~ uri += '&sortdir='+sortdir;
		uri += '&step=' + step;
        return uri;
    }

    function getURLAddress() {
        return document.URL.split('#')[0].split('?')[0];
    }

    function getQuery(omit) {
        var url = document.URL;
   
        // Anker herausfiltern
        var tmp = url.split('#');
        if (tmp[0]) url = tmp[0];
        
        // URL Parameter separieren
        tmp = url.split('?');
        var query = tmp[1] ? tmp[1] : '';
        if (attr_haveTmpQuery(omit)) {
            tmp = attr_parseQuery(query); // query, remaining params
            tmp = attr_getTmpQuery(qsensei_query_prefix, attr_getMaxPosition(tmp[0])+1, omit);
            if (query.length) query += '&';
            return query + attr_compileQuery(tmp);
        }
        return query;
    }
	
	
	
	function QsenseiKinds() {
			stepSpeed = 550; // ms
			showBlocks = 4;	
			QsenseiKindsObject = this;	
			tooltipWording = jQuery('#QSstepforward').attr('title');
		
			if(typeof(kindsAmount) == "undefined") kindsAmount = 0;
			if(typeof(step) == "undefined") step = 0;
		
		
			this.updateStepLinks = function updateStepLinks() {
				if(step > 0) {
					jQuery('#QSstepbackward').removeClass('step_backward_false').attr({
						'title': tooltipWording
					});
					jQuery('#QSstepbackward').addClass('step_backward');
					
				} else {
					jQuery('#QSstepbackward').removeClass('step_backward').removeAttr('title');
					jQuery('#QSstepbackward').addClass('step_backward_false');
				}
				if(step >= kindsAmount - showBlocks) {
					jQuery('#QSstepforward').removeClass('step_forward').removeAttr('title');;
					jQuery('#QSstepforward').addClass('step_forward_false');
				} else {
					jQuery('#QSstepforward').removeClass('step_forward_false');
					jQuery('#QSstepforward').addClass('step_forward').attr({
						'title': tooltipWording
					});;
				}
				
				if(step >= kindsAmount - showBlocks) { 
					current = kindsAmount - step;
					jQuery('#currentStep').html(current); 
				} else {
					jQuery('#currentStep').html('4');
				}
				
				jQuery('.attr_link, .batchnav > li > a').attr('href', function() {
						thisLink = jQuery(this).attr('href');
						linkItems = thisLink.split('&');
						newLink = '';
						hasStepParam = false;
						jQuery(linkItems).each(function() {
							param = this.split('=')[0];
							if(param == 'step') {
								newLink += "step="+step;
								hasStepParam = true;
							} else {
								newLink += this + "&";
							}
						});
						if(!hasStepParam) {
							newLink = thisLink + "&step=" + step;
						}
						return newLink;
					}
				);



			}
			
			this.forward = function forward() {
				if(step < kindsAmount - showBlocks) {
					jQuery(".wrapper").animate({left: "-="+(stepsPx*4)+"px"}, stepSpeed );
					step += 4;
					QsenseiKindsObject.updateStepLinks();
				}
				return false;
			}
			
			this.backward = function backward() {
				if(step > 0) {
					jQuery(".wrapper").animate({left: "+="+(stepsPx*4)+"px"}, stepSpeed );
					step -= 4;
					QsenseiKindsObject.updateStepLinks();
				}
				return false;
			}	
			
			this.setStepPx = function setStepPx(px) {
				stepsPx = px;
			}
		}
		

		var allBoxesChecked = false;
		var checked_compare = 0;
		var checked_compare_field = [];
		
		function UpdateVersionsCompareLink() {
			if (checked_compare == 2) {
				id1 = checked_compare_field[1].split('_')[2];
				id2 = checked_compare_field[2].split('_')[2];
				jQuery('#compare_btn').attr({
					'href': 'versions/' + id1 + '/compare/' + id2
				});
			} else {
				jQuery('#compare_btn').attr({
					'href': 'versions/'
				});
			}
		}
		
		jQuery(document).ready(function() {
			
			jQuery('.ajax_clear_viewed, .ajax_clear_searches').dblclick(function() {
				
				block = jQuery(this).parent().parent();
				url = jQuery(this).attr('class').split(" ")[0];
				
				
				jQuery.ajax({
					type: "POST",
					data: {
						action: "clear"
					},
					url: url,
					success: function(){												
						block.fadeOut(500);
					}
				});					
			});
					
			
			jQuery('.compare_version_box').each(function(i, item) {
				if(item.checked) {
					checked_compare++;
					checked_compare_field[checked_compare] = jQuery(this).attr('id');
				}
				UpdateVersionsCompareLink();
			});
			
			jQuery('.compare_version_box').click(function() {
				if(this.checked) {
					checked_compare++;
					if(checked_compare > 2) {
						document.getElementById(checked_compare_field[2]).checked = false;
						checked_compare = 2;
						
					}
					
					checked_compare_field[checked_compare] = jQuery(this).attr('id');
					
				} else {
					if(jQuery(this).attr('id') == checked_compare_field[1]) {
						checked_compare_field[1] = checked_compare_field[2];
					}
					checked_compare--;
				};
				
				UpdateVersionsCompareLink();
				
			});
			
						
			jQuery('#history_view_wrapper #picture').css({opacity: 0.8});
			
			if(typeof(kindsAmount) == "undefined") kindsAmount = 0;
			if(typeof(step) == "undefined") step = 0;
						
			jQuery('#mark_all_btn').click(function() {				
				jQuery('form input.checkbox').each(function(i, item) {
					if (allBoxesChecked) {
						item.checked = false;
					} else {						
						item.checked = 'checked';
					}				
				});	
				if(allBoxesChecked) {
					allBoxesChecked = false 
				} else {
					allBoxesChecked = true;
				}
				return false;				
			});
			
			var titleAuthorWrapperHeight = jQuery('#title_author_wrapper').height();
			jQuery('#detail_page').css({'backgroundPosition': '0px -' + (294-titleAuthorWrapperHeight) + 'px'});
			jQuery('#google_ad').css({'paddingTop': parseInt(30+titleAuthorWrapperHeight) + 'px'});
			
			jQuery('a.innerkw').hover(function() {
				jQuery(this).addClass('hover').parent().addClass('hover');
			},function() {
				jQuery(this).removeClass('hover').parent().removeClass('hover');
				
			});
			
			jQuery("form").submit(function() {
				initValue = jQuery('#initValue').val();
				formVal = jQuery('#searchbarfield').val();
				if(formVal == initValue) jQuery('#searchbarfield').val('');				
			});
			
			qsField = jQuery('#searchbarfield');
			initValue = jQuery('#initValue').val();
			if(qsField.val() == initValue) {
				qsField.focus(function() {
					jQuery(this).val('').removeClass('input_gray');							
				});	
			}
		
			var qsenseiKinds = new QsenseiKinds();
			qsenseiKinds.updateStepLinks();
			jQuery('#QSstepforward').click(function() {
				qsenseiKinds.forward();
			}).mousedown(function() {
				if(jQuery(this).hasClass('step_forward')) jQuery(this).addClass('forwardclick');
			}).mouseup(function() {
				jQuery(this).removeClass('forwardclick');
			});
			jQuery('#QSstepbackward').click(function() {
				qsenseiKinds.backward();
			}).mousedown(function() {
				if(jQuery(this).hasClass('step_backward')) jQuery(this).addClass('backwardclick');
			}).mouseup(function() {
				jQuery(this).removeClass('backwardclick');
			});
			
			
			verticalOffset = 9;
			horizontalOffset = 5;
			if (jQuery.browser.msie) {if(jQuery.browser.version < 7) {verticalOffset = 3;horizontalOffset = 5;} else {verticalOffset = 0;}}	
			if (jQuery.browser.opera) {	verticalOffset = 8;	}			
			jQuery('.attr_link_wrapper').each(function(){
			linkX = jQuery("#" + this.id + " > .activefilteritem").offset().left;
			cross = jQuery("#" + this.id + " > .attr_link").offset();
			crossX = cross.left;
			crossY = cross.top;
			if ((crossX - horizontalOffset) <= linkX || (crossX-137) >= linkX) {
				jQuery("#" + this.id + " > .attr_link").css({
					"display": "block",
					"position": "absolute",
					"left": "" + (linkX + 147) + "px",
					"top": "" + (crossY - verticalOffset) + "px"
				});
			}
		});
		
	jQuery('#explore_button').click(function() {	
		toggleKind('popup', 'tags');
		tb_show(null, '#TB_inline?height=450&width=600&inlineId=popupKinds_wrapper', false, '');
        return false;        
	});
			
			
		});
