Ext.onReady(function() {
	if (Ext.isChrome || Ext.isSafari) return;
	Ext.History.init();
	
	var href = top.location.href, i = href.indexOf("#");
	var token = (i >= 0 ? href.substr(i + 1) : null);
	if (token != null && token.length > 0) {
        updResults(token);
	}
});

Ext.History.on('change', updResults);

function updResults(token) {
    if (!token) token = getElementValue('FirstPost');
	
	if(token){
		var el = Ext.get('searchResults');
		if (el == null) return true;
		deserializeForm(token);
		
		var upd = el.getUpdater();
		upd.showLoadIndicator = false;		
		upd.on('failure', postFailed);
		upd.on('beforeupdate', showLoading);
		upd.on('update', afterUpdate);
		upd.update({
			url: '/controllers/ss_search.asp'
			, params: token
		});
	}
}

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 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', '');
		}
		
		if (Ext.isChrome || Ext.isSafari || Ext.isOpera) {
			var upd = el.getUpdater();
			upd.showLoadIndicator = false;		
			upd.on('failure', postFailed);
			upd.on('beforeupdate', showLoading);
			upd.on('update', callback || afterUpdate, scope);
			upd.formUpdate(formEl, '/controllers/ss_search.asp');
		} else {
			Ext.History.add(serializeForm(formEl));
		}

		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);
    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('store_1');
    var chkVint = getElementValue('store_2');
    var chkArt = getElementValue('store_3');
    var chkTrav = getElementValue('store_4');

    if (!chkCont && !chkVint && !chkArt && !chkTrav) {
		setElementValue('store_0', true);
		setCollection('store_0');
    }
	
    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 setStoreFilters(el) {
	var storeName = el.value;
	var checked = el.checked;
	
	if (checked) {
		Ext.select('div.search-form-terms').addClass('search-titled');
		showElement("Srch_Title", true);
	} else {
		hideElement("Srch_Title", true);
		setTimeout("Ext.select('div.search-form-terms').removeClass('search-titled');", 400);
	}
	
	switch(storeName) {
		case 'Travel':
			setElementValue('store_0', !checked);
			setElementValue('store_1', !checked);
			setElementValue('store_2', !checked);
			setElementValue('store_3', !checked);
			setElementValue('store_4', true);
			
			break;
		case 'Fine Art':
			setElementValue('store_0', !checked);
			setElementValue('store_1', !checked);
			setElementValue('store_2', !checked);
			setElementValue('store_3', true);
			setElementValue('store_4', !checked);
			
			break;
		case 'Vintage':
			setElementValue('store_0', !checked);
			setElementValue('store_1', !checked);
			setElementValue('store_2', true);
			setElementValue('store_3', !checked);
			setElementValue('store_4', !checked);
			
			break;
		case 'Rights-Managed':
			setElementValue('chkRMFilter', true);
			setElementValue('chkRFFilter', !checked);
			
			break;
		case 'Royalty-Free':
			setElementValue('chkRMFilter', !checked);
			setElementValue('chkRFFilter', true);
			
			break;
	}
}

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);
			Ext.select('div.search-form-terms').addClass('search-titled');
			
			if (Srch_Brand)
				setElementValue('BrandName', Srch_Brand);
	    } else {
			hideElement(Srch_Title, true);
			setTimeout("Ext.select('div.search-form-terms').removeClass('search-titled');", 400);
		}

	    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);
	    setTimeout("Ext.select('div.search-form-terms').removeClass('search-titled');", 400);

	    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);
	    setTimeout("Ext.select('div.search-form-terms').removeClass('search-titled');", 400);

	    break;
	case 3: //CD
	    chk = getElementValue('chkCDFilter');

	    setElementValue('chkRMFilter', !chk);
	    setElementValue('chkRFFilter', !chk);
		hideElement(Srch_Title, true);
		setTimeout("Ext.select('div.search-form-terms').removeClass('search-titled');", 400);

	    if (!chk) return;
	    setElementValue('chkPGFilter', !chk);

	    break;
    }
}

function setCollection(el) { setStore(el); }
function setStore(el) {
    var id = el.id || el;
    var chkAll = getElementValue('store_0');
    var chkCont = getElementValue('store_1');
    var chkVint = getElementValue('store_2');
    var chkArt = getElementValue('store_3');
    var chkTrav = getElementValue('store_4');

    if (id == 'store_0') {
		setElementValue('store_1', chkAll);
		setElementValue('store_2', chkAll);
		setElementValue('store_3', chkAll);
		setElementValue('store_4', chkAll);
    } else {
		setElementValue('store_0', chkCont && chkVint && chkArt && chkTrav);
    }
}

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() {
	displayNextArrow();
    var el = Ext.getBody();
    el.scrollTo('left', 0);
    el.scrollTo('top', 0);
}

//Helpers
function serializeForm(el) {
    return Ext.lib.Ajax.serializeForm(Ext.getDom(el));
}

function deserializeForm(s) {
	var obj = Ext.urlDecode(s);
    for (token in obj)
		if (obj[token] != null || obj[token] != '') {
			if (token != 'Stores') {
				setElementValue(token, obj[token]);
			} else {
				var vals = obj[token];
				if (typeof vals != 'object')
					vals = [vals];
					
				setElementValue('store_0', false);
				setElementValue('store_1', false);
				setElementValue('store_2', false);
				setElementValue('store_3', false);
				setElementValue('store_4', false);
				
				for (var i = 0, len = vals.length; i < len; i++) {
					switch(parseInt(vals[i])) {
						case 1:	//Any
							setElementValue('store_0', true);
							break;
						case 2:	//Travel
							setElementValue('store_4', true);
							break;
						case 4:	//Vintage
							setElementValue('store_2', true);
							break;
						case 8:	//FineArt
							setElementValue('store_3', true);
							break;
						//case 16:	//MidStock
						//case 32:	//SuperStockTravel
						case 64:	//Contemporary
							setElementValue('store_1', true);
							break;
					}
				}
			}
		}
}

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.setVisibilityMode(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 focusElement(el) {
	Ext.get(el).focus();
}

function setElementValue(el, value) {
    if (typeof el === "string")
    	el = Ext.get(el);
    	
    if (!el) return;
	el = el.dom;

    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 = Ext.get(el);
	    
    if (!el) return null;
    el = el.dom;
    
    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) {
    return Ext.get(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)
				if (nodes[i].attributes['id'])
					if (nodes[i].attributes['id'].value == id)
						return nodes[i];
				
		return nodes;
	}
}*/ 

Ext.EventManager.onWindowResize(displayNextArrow, this, false);
