function srchSubmit(newSearch, formId, callback, scope, isPaging) {
    if (!chkForm()) return false;

    if (newSearch)
		setElementValue('pagenum', 1);

    try {
		var el = Ext.get('searchResults');
		if (el == null) return true;
		
		var upd = el.getUpdater();
		var formEl = elementExists('CDStoreForm') ? 'CDStoreForm' : 'Srch_Form';
		var fEl = Ext.get(formEl);
		var pEl = Ext.get('pagingHelper');
		
		//hackish
		if (isPaging && !pEl) {
			var val = getElementValue('within1');
			var idx = val.indexOf('(', 1);
			val = val.substring(idx);
			
			if (idx > -1)
				fEl.createChild({
					tag: 'input'
					, type: 'hidden'
					, name: 'txtkeys1prev'
					, value: val.substring(0,val.length-1)
					, id: 'pagingHelper'
				});
		} else if (!isPaging && pEl) {
			pEl.remove();
		}
		
		if (!isPaging) {
			setElementValue('chkCatFilter', '');
		}
		
		upd.showLoadIndicator = false;
		upd.on('failure', postFailed);
		upd.on('beforeupdate', showLoading);
		upd.on('update', callback || afterUpdate, scope);
		upd.formUpdate(formEl, '/controllers/ss_search.asp');

		if (!isPaging && !elementExists('CDStoreForm')) adjWithin();
    } catch(e) {
		return true;
    }

    return false;
}

function getWidth(){
    return (typeof window.innerWidth == 'undefined')?document.body.clientWidth:window.innerWidth;
}

function displayNextArrow() {
	if (!elementExists('next_page') || getPageNum() == getPageCount()) return;
	
    //if(getPageNum() <= getPageCount()) {
		var retWidth = Ext.get('searchResults').getComputedWidth();
		var pageSize = parseInt(getElementValue('pixperpage'));
		var blockSize = 184;
		
		/*
		if (Ext.isSafari) win=274;
		else if (Ext.isGecko) win=276;
		else win=253;
		*/
		
		if(pageSize % Math.floor(retWidth / blockSize))
			showElement('next_page', false)
		else
			hideElement('next_page', false)
    //}
}

function setPixPerPage(el) {
    var pageSize = el.options[el.selectedIndex].value;

    if (srchSubmit(true, 'Srch_Form')) {
		var form = document.getElementById('Srch_Form');
		form.submit();
    }
}

function srch_pagenum(evt, obj) {
    var key = evt.charCode || evt.keyCode;

    switch (key) {
	case 13:
	    gotoPage(obj.value);
	    break;
	case 8:
	case 37:
	case 39:
	case 46:
	case 48:
	case 49:
	case 50:
	case 51:
	case 52:
	case 53:
	case 54:
	case 55:
	case 56:
	case 57:
	case 96:
	case 97:
	case 98:
	case 99:
	case 100:
	case 101:
	case 102:
	case 103:
	case 104:
	case 105:
	    return true;
	case 34:
	case 40:
	    if (obj.value.length == 0)
		obj.value = getPageNum();

	    if (parseInt(obj.value) > 1)
		obj.value = parseInt(obj.value) - 1;
	    else
		obj.value = 1;
	    break;
	case 33:
	case 38:
	    if (obj.value.length == 0)
		obj.value = getPageNum();

	    if (parseInt(obj.value) < getPageCount())
		obj.value = parseInt(obj.value) + 1;
	    else
		obj.value = getPageCount();
	    break;
	default:
	    return false;
    }
}

function setKeywordsFromList(kw, s) {
	if (!s) kw = kw.replace(/"/g,'');
	
    setElementValue('txtkeys1', kw);
	/*
    setElementValue('chkPGFilter', false);
    setElementValue('chkRMFilter', true);
    setElementValue('chkRFFilter', true);
    setElementValue('imgextra0', true);
	setElementValue('imgextra1', true);
	setElementValue('imgextra2', true);
	setElementValue('imgextra3', true);
	*/
    if (srchSubmit(true, 'Srch_Form')) {
		var form = document.getElementById('Srch_Form');
		form.submit();
    }
}

function nextPage() {
    var pageNum = getPageNum();
    pageNum++;

    return gotoPage(pageNum);
}

function prevPage() {
    var pageNum = getPageNum();
    pageNum--;

    return gotoPage(pageNum);
}

function gotoPage(pageNum, callback, scope) {
    setPageNum(pageNum);

    if (srchSubmit(false, null, callback, scope, true)) {
		var form = document.getElementById(elementExists('CDStoreForm') ? 'CDStoreForm' : 'Srch_Form');
		form.submit();
    }

    return false;
}

function getPageCount() {
    return parseInt(getElementValue('rsPageCount'));
}

function getPageNum() {
    var num = parseInt(getElementValue('pagenum'));
    if (isNaN(num)) num = 1;
    return num;
}

function setPageNum(pageNum) {
    var pageCount = getPageCount();
    pageNum = pageCount >= pageNum ? pageNum : pageCount;
    pageNum = pageNum > 0 ? pageNum : 1;
    setElementValue('pagenum', pageNum);
}

function chkForm() {
    if (getElementValue('cdstore') == 1) return true;
    var chkCont = getElementValue('imgextra1');
    var chkVint = getElementValue('imgextra2');
    var chkArt = getElementValue('imgextra3');

    if (!chkCont & !chkVint & !chkArt) {
		setElementValue('imgextra0', true);
		setCollection('imgextra0');
    }
	
    return getElementValue('chkCatFilter').length > 0 || getElementValue('txtkeys1').length > 0;
}

function adjWithin() {
	var terms = getElementValue('txtkeys1');
	var prev = document.getElementById('within');
    
	if (getElementValue('within1') && prev.checked) {
		prev.value = '(' + terms + ' AND ' + prev.value + ')';
    } else {
		prev.value = '(' + terms + ')';
    }

	setElementValue('within1', prev.value);
    setElementValue('within', false);
}

function ToggleAllFotog(el) {
    var prefix = el.id.replace("chkAll", "") + "_";
    var i = 0;

    while(elementExists(prefix+i)) {
		var fotog = document.getElementById(prefix+i);
		setElementValue(prefix+i, el.checked);
		ToggleFotog(fotog, true);
		i++;
    }
}

function ToggleAllCat(el) {
    for (var i = 1, len=17; i < len; i++) {
		var cat = document.getElementById("idcat"+i);
		setElementValue(cat, el.checked);
		ToggleCat(cat, true);
    }
}

function Fotog_CanCheckAll(par) {
    var prefix = par.replace("chkAll", "") + "_";
    var i = 0;
    var ret = true;

    while(elementExists(prefix+i)) {
		ret = ret & getElementValue(prefix+i);
		i++;
    }

    return ret;
}

function Cat_CanCheckAll() {
    var ret = true;

    for (var i = 1, len=17; i < len; i++) {
		ret = ret & getElementValue("idcat"+i);
    }

    return ret;
}

function ToggleFotog(el, all) {
    var fotog = getElementValue("fotog");
    var par = "chkAll" + el.id.substring(0,2);
    var re = new RegExp("^"+el.value+"[;$]?|;"+el.value+"[$]?", "g");

    if (el.checked) {
		if (fotog.length > 0) fotog += ";"
		fotog += el.value;
    } else {
		fotog = fotog.replace(re, "");
    }

    setElementValue("fotog", fotog);
    if (!all) setElementValue(par, Fotog_CanCheckAll(par));
}

function ToggleCat(el, all) {
    var cat = getElementValue("cat");
    var re = new RegExp("^"+el.value+"[;$]?|;"+el.value+"[$]?", "g");

    if (el.checked) {
		if (cat.length > 0) cat += ";";
		cat += el.value;
    } else {
		cat = cat.replace(re, "");
    }

    setElementValue("cat", cat);
    if (!all) setElementValue("idcat0", Cat_CanCheckAll());
}

function setFilters(filterIndex) {
    var Srch_BrandName = Srch_Brand || getElementValue("BrandName");
    var Srch_PG = getElementValue("Srch_PG");
    var Srch_Title = 'Srch_Title';

    var chk
    switch (filterIndex) {
	case 0: // PG
	    chk = getElementValue('chkPGFilter');

	    //setElementValue('chkRMFilter', !chk);
	    //setElementValue('chkRFFilter', !chk);

	    if (chk) {
			showElement(Srch_Title, true);
			setElementValue(Srch_Title, 'Search ' + Srch_BrandName);

			if (Srch_Brand)
				setElementValue('BrandName', Srch_Brand);
	    } else
			hideElement(Srch_Title, true);

	    if (!chk) return;

	    setElementValue('chkCDFilter', !chk);

	    break;
	case 1: // RM
	    chk = getElementValue('chkRMFilter');
	    var chkRF = getElementValue('chkRFFilter');

	    if (!chk & !chkRF)
		setElementValue('chkRFFilter', !chk);

	    if (!chk) return;

	    setElementValue('chkCDFilter', !chk);
	    //setElementValue('chkPGFilter', !chk);
	    hideElement(Srch_Title, true);

	    break;
	case 2: // RF
	    chk = getElementValue('chkRFFilter');
	    var chkRM = getElementValue('chkRMFilter');

	    if (!chk & !chkRM)
			setElementValue('chkRMFilter', !chk);

	    if (!chk) return;

	    setElementValue('chkCDFilter', !chk);
	    //setElementValue('chkPGFilter', !chk);
	    hideElement(Srch_Title, true);

	    break;
	case 3: //CD
	    chk = getElementValue('chkCDFilter');

	    setElementValue('chkRMFilter', !chk);
	    setElementValue('chkRFFilter', !chk);
		hideElement(Srch_Title, true);

	    if (!chk) return;
	    setElementValue('chkPGFilter', !chk);

	    break;
    }
}

function setCollection(el) {
    var id = el.id || el;
    var chkAll = getElementValue('imgextra0');
    var chkCont = getElementValue('imgextra1');
    var chkVint = getElementValue('imgextra2');
    var chkArt = getElementValue('imgextra3');

    if (id == 'imgextra0') {
		setElementValue('imgextra1', chkAll);
		setElementValue('imgextra2', chkAll);
		setElementValue('imgextra3', chkAll);
    } else {
		setElementValue('imgextra0', chkCont & chkVint & chkArt);
    }
}

var Srch_Brand = null;
function showLoading(updr, form, url) {
	if (!getElementValue('chkPGFilter')) {
		Srch_Brand = getElementValue('BrandName');
		setElementValue('BrandName', '');
	}
	
    showElement('Srch_Loader');
    showElement('Srch_Loader2');
    return true;
}

function postFailed() {
    hideElement('Srch_Loader');
    hideElement('Srch_Loader2');
    hideElement('searchResults');
    showElement('searchError');
}

function afterUpdate() {
	//showElement('searchResults', false);
    displayNextArrow();
    window.location.hash = "#top";
}

//Helpers
function serializeForm(el) {
    var formData = Ext.lib.Ajax.serializeForm(Ext.getDom(el));

    //format form as an object
    formData = formData.replace(/\&/g, '\',');
    formData = formData.replace(/=/g, ':\'');

    return eval('({' + formData + '\'})');
}

function deserializeForm(obj) {
    for (token in obj)
	setElementValue(token, obj[token]);
}

function serialize(obj) {
    var data = '';

    for (token in obj) {
		if (typeof obj[token] === 'object')
			data += token + ':{' + serialize(obj[token]) + '}';
		else if (typeof obj[token] === 'string')
			data += token + ':\'' + obj[token] + '\'';
		else if (typeof obj[token] === 'number')
			data += token + ':' + obj[token];
		else
			continue;

		data += ',';
    }

    return data.substring(0, data.length-1);
}

function deserialize(str) {
    str = str.replace(/%20/g, ' ');
    str = str.replace(/%22/g, '"');
    str = str.replace(/%23/gi, '#');
    str = str.replace(/%24/g, '$');
    str = str.replace(/%25/g, '%');
    str = str.replace(/%26/g, '&');
    str = str.replace(/%27/g, '\'');
    str = str.replace(/%2B/gi, '+');
    str = str.replace(/%2C/gi, ',');
    str = str.replace(/%2F/gi, '/');
    str = str.replace(/%3A/gi, ':');
    str = str.replace(/%3B/gi, ';');
    str = str.replace(/%3C/gi, '<');
    str = str.replace(/%3D/gi, '=');
    str = str.replace(/%3E/gi, '>');
    str = str.replace(/%3F/gi, '?');
    str = str.replace(/%40/gi, '@');
    str = str.replace(/%5B/gi, '[');
    str = str.replace(/%5C/gi, '\\');
    str = str.replace(/%5D/gi, ']');
    str = str.replace(/%5E/gi, '^');
    str = str.replace(/%60/gi, '`');
    str = str.replace(/%7B/gi, '{');
    str = str.replace(/%7C/gi, '|');
    str = str.replace(/%7D/gi, '}');
    str = str.replace(/%7E/gi, '~');

    return eval('({' + str + '})');
}

function showElement(el, animate) {
    var el = Ext.get(el);
    if (el != null) el.show(animate);
}

function hideElement(el, animate) {
    var el = Ext.get(el);
    if (el == null) return;
    el.visibilityMode = Ext.Element.DISPLAY;
    el.hide(animate);
}

function showMask(el) {
    var el = Ext.get(el);
    el.mask();
}

function hideMask(el) {
    var el = Ext.get(el);
    el.unmask();
}

function setElementValue(el, value) {
    if (typeof el === "string")
	el = document.getElementById(el);
    if (!el) return;

    if (typeof el.checked != 'undefined' & (el.type == 'checkbox' | el.type == 'radio'))
	el.checked = value;
    else if (typeof el.value != 'undefined')
	el.value = value;
    else
	el.innerHTML = value;
}

function getElementValue(el) {
    if (typeof el === "string")
	el = document.getElementById(el);
    if (!el) return null;

    if (typeof el.checked != 'undefined' & (el.type == 'checkbox' | el.type == 'radio'))
		return el.checked;
    else if (typeof el.value != 'undefined')
		return el.value;
    else
		return el.innerHTML;
}

function elementExists(el) {
    el = document.getElementById(el);
    return el !== null;
}

/**
 * Fix Dumb4$$ M1cro5oft's fuckup.
 *     ^ Their title       ^ Most of their products are
 *
 * I'm tired of having to develop hacks for M$ browsers, cause they can't read W3C standards.
 */ 
if (/msie/i.test(navigator.userAgent)) {
	document.getElementById = function(id) {
		var nodes = document.all[id];
		if (!nodes) return null;
		if (!nodes.length || nodes.length == 0) return nodes;
		
		for (var i = 0, len = nodes.length; i < len; i++)		
			if (nodes[i].attributes 
			&& nodes[i].attributes['id'] 
			&& nodes[i].attributes['id'].value == id)
				return nodes[i];
				
		return nodes;
	}
}

Ext.EventManager.onWindowResize(displayNextArrow, this, false);
