// GLOBAL VARS
var searchAreaId = 'sel_image';
var trashAreaId = 'trash';
var hiliteColor = "#91b50b"; //"#FF0000";
var hiliteImage = "url(image/fave_bg_over.gif)"; 
var lock_preview = false;
var drag = false;

var after_drag = false;

var skip_preview = false;

var previewImageId = '';
var previewBigImageId = '';
var previewImageC = '';

var overImage = null;
var overImageWait = false;
var previewEffect = null;
var previewShowTimeout = false;

var isOpera = (typeof opera != 'undefined');
var isGecko = !document.attachEvent && document.addEventListener && (isOpera == false);
var isMSIE = !isOpera && (document.attachEvent != null);

var initDnd = null;

// NEW DRAGGABLE
var xCavatorDraggable =  Class.create();/*{{{*/
xCavatorDraggable.prototype = (new Rico.Draggable()).extend( {
	initialize: function(htmlElement, type, fave) {
		this.htmlElement = $(htmlElement);
		this.type		  = type;
		this.id 		 = htmlElement;
		this.fave 		 = (typeof fave =='undefined'?-1:fave);
	},

	startDrag: function () {
		after_drag = true;
		drag = true;
		xc_wm.mouseOver('image', 1);
	},

	endDrag: function () {
		drag = false;
		xc_wm.mouseOut('image');


//		if ( navigator.userAgent.toLowerCase().indexOf("firefox")>=0 ) { //firefox fires onCLick after endDrag & cancelDrag. IE & Opera fire onClick after cancelDrag only
//		}

		if (this.htmlElement.parentNode == $(searchAreaId)) {
			xc_search.updateSelectedImage( {mode: 'select', id: this.htmlElement.id.substr(1)} );
			this.htmlElement.parentNode.removeChild(this.htmlElement);
			if (this.fave != -1) {
				initDnd.faves[this.fave].appendChild(this.htmlElement);
			} else {
				$(this.htmlElement.id+'_prv').appendChild(this.htmlElement);
			}
			xc_wm.mouseClick('image', 1, 1);
		} else if (this.htmlElement.parentNode == $(trashAreaId)) {
			this.htmlElement.parentNode.removeChild(this.htmlElement);
			if ($(this.htmlElement.id+'_prv')) {
				$(this.htmlElement.id+'_prv').appendChild(this.htmlElement);
			}
			this.type = 'dndFirstDrag';
			this.fave = -1;
			xc_search.removeFave(this.htmlElement.id.substr(1), 'image_id');			
		} else {

			// to faves
			var n = initDnd.faves.length;
			for (var i=0; i < n; i++) {
				var aFave = initDnd.faves[i];
				if (this.htmlElement.parentNode == initDnd.faves[i]) {
					xc_search.addFave(this.htmlElement.parentNode.id.substr(1), this.htmlElement.id);
					this.fave = i;
					this.type = 'dndAfterDrag';
					this.htmlElement.className = 'unDraggable';
				}
			}

			// return back
			n = initDnd.prevs.length;
			for (var i=0; i < n; i++) {
				if (this.htmlElement.parentNode == initDnd.prevs[i]) {
					this.type = 'dndFirstDrag';
					this.fave = -1;
					this.htmlElement.className = 'draggable';
				}
			}
		}
		setTimeout('after_drag = false;', 100);
	},
	cancelDrag: function() {
		drag = false;
		setTimeout('after_drag = false;', 100);
	}
} );/*}}}*/

// NEW DROPZONE
var xCavatorDropzone =  Class.create();/*{{{*/
xCavatorDropzone.prototype = Rico.Dropzone.prototype.extend( {
	initialize: function(htmlElement) {
	 	this.htmlElement  = $(htmlElement);
		this.id = htmlElement;
	},
	activate: function() {
		var htmlElement = this.getHTMLElement();
		if (htmlElement == null  || this.showingActive)
			return;

		this.showingActive = true;
		htmlElement.className += ' drop-active';
	},

	deactivate: function() {
		var htmlElement = this.getHTMLElement();
		if (htmlElement == null || !this.showingActive)
			return;

		this.showingActive = false;
		htmlElement.className = htmlElement.className.replace(/ drop-active/, '').replace(/drop-active/, '');
	},

	showHover: function() {
		var htmlElement = this.getHTMLElement();
		if (htmlElement == null || this.showingHover)
			return;
		htmlElement.className += ' drop-over';
		this.showingHover = true;
	},
	hideHover: function() {
		var htmlElement = this.getHTMLElement();
		if (htmlElement == null || !this.showingHover)
			return;

		htmlElement.className = htmlElement.className.replace(/ drop-over/, '');
		this.showingHover = false;
	},
	canAccept: function(draggableObjects) {
		if (this.htmlElement.id == searchAreaId) {
			return xc_search.search_image_enabled;
		}

	 	for (var i=0 ; i<draggableObjects.length ; i++) {

		  	if (draggableObjects[i].fave == -1) {
				if (this.id.substr(-4) == '_prv') return false;
				if (this.htmlElement.childNodes && this.htmlElement.childNodes.length/* && this.htmlElement.lastChild.className=='unDraggable'*/) return false;
				if (this.htmlElement.id == trashAreaId) return false;
			} else if (draggableObjects[i].fave > -1) {
				if (this.id.substr(-4) == '_prv' && this.id != (draggableObjects[i].id +'_prv')) return false;
				if (this.htmlElement.className == 'favecell' && this.htmlElement.id != trashAreaId) return false;
				if (this.htmlElement.childNodes && this.htmlElement.childNodes.length && this.htmlElement.id != 'c'+(draggableObjects[i].fave+1)) return false;
			}
			return true;
		}
	}
} );/*}}}*/

// NEW DRAG'n'DROP
var dndXCavator = Class.create();/*{{{*/
Rico.DragAndDrop.prototype.extend({
	_mouseUpHandler: function(e) {
		if ( ! this.hasSelection() )
			return;

		var nsEvent = e.which != undefined;
		if ( (nsEvent && e.which != 1) || (!nsEvent && e.button != 1))
			return;

		this.interestedInMotionEvents = false;

		if ( this.dragElement == null ) {
//			this._terminateEvent(e);
			return;
		}

		if ( this._placeDraggableInDropZone(e) )
			this._completeDropOperation(e);
		else {
			this._terminateEvent(e);
//		 if (this.dragElement.parentNode.className == 'favecell') {
//		 	this.origPos = RicoUtil.toDocumentPosition($(this.dragElement.id + '_prv'));
//		 }
		 
		 new Rico.Effect.Position( this.dragElement,
										this.origPos.x,
										this.origPos.y,
										10,
										10,
										{ complete : this._doCancelDragProcessing.bind(this) } );
		}

	  Event.stopObserving(document.body, "mousemove", this._mouseMove);
	  Event.stopObserving(document.body, "mouseup",  this._mouseUp);
	}

});/*}}}*/

dndXCavator = (new Rico.DragAndDrop()).extend( {/*{{{*/

//xCavatorDropzone.prototype = Rico.Dropzone.prototype.extend( {
	deregisterDropZone: function(aDropZone) {
		var newDropZones = new Array();
		var j = 0;
		for (var i = 0; i < this.dropZones.length; i++) {
			if (this.dropZones[i].id != aDropZone.id)
				newDropZones[j++] = this.dropZones[i];
		}
		this.dropZones = newDropZones;
	}

} );/*}}}*/

// INITIALIZE DRAG'n'DROP
var initializeDnd = Class.create();/*{{{*/
initializeDnd.prototype = {
	initialize: function(draggables, faves, prevs) {
		this.draggables = draggables;
		this.faves		= faves;
		this.prevs		= prevs;
	},

	dndNow: function() {
		dndXCavator.initializeEventHandlers();
		var n = this.draggables.length;
		for (var i=0; i < n; i++) {
			if (this.draggables[i].parentNode.id.match(/^c(\d+)$/)) {
				dndXCavator.registerDraggable(new xCavatorDraggable( this.draggables[i].id, 'dndAfterDrag' , this.draggables[i].parentNode.id.substr(1)-1 ));
			} else {
				dndXCavator.registerDraggable(new xCavatorDraggable( this.draggables[i].id, 'dndFirstDrag' , -1));
			}
		}
		n = this.faves.length;
		dndXCavator.registerDropZone(new xCavatorDropzone(searchAreaId));
		for (var i=0; i < n; i++) {
			dndXCavator.registerDropZone(new xCavatorDropzone(this.faves[i].id));
		}
	},

	clearDraggables: function() {
		dndXCavator.draggables = new Array();
	},

	clearPrevs: function() {
		this.prevs = new Array();
	},

	setDraggables: function(draggables) {
		this.draggables = draggables;
		var n = this.draggables.length;
		for (var i=0; i < n; i++) {
			if (this.draggables[i].parentNode.id.match(/^c(\d+)$/)) {
				dndXCavator.registerDraggable(new xCavatorDraggable( this.draggables[i].id, 'dndAfterDrag' , this.draggables[i].parentNode.id.substr(1)-1 ));
			} else {
				dndXCavator.registerDraggable(new xCavatorDraggable( this.draggables[i].id, 'dndFirstDrag' , -1));
			}
		}
	},
	setPrevs: function(prevs) {
		this.prevs = prevs;
	}
};/*}}}*/


function openFull(id) {
	if (!id) {
		id = previewImageId;
	}
	window.open(fullLinks['p'+id], '', '');
}

function favesIsEmpty() {
	var c = document.getElementsByTagAndClassName('div','favecell');
	var n = c.length;
	var ids = [];
	for (var i = 0; i < n; i++) {
		if (c[i].firstChild) {
			return false;
		}
	}
	return true;
}


function isChildOf(child, parent) {
	if( child != null ) {			
		while( child.parentNode ) {
			if( (child = child.parentNode) == parent ) {
				return true;
			}
		}
	}
	return false;
}

function getFaveIds() {
	var c = document.getElementsByTagAndClassName('div','favecell');
	var n = c.length;
	var ids = [];
	for (var i = 0; i < n; i++) {
		if (c[i].firstChild) {
			ids[ids.length] = c[i].firstChild.id;
		}
	}
	return ids;
}

function isFavesFull() {
	return getFaveIds().length == 11;
}

function getFaveLinks() {
	var c = document.getElementsByTagAndClassName('div','favecell');
	var n = c.length;
	var links = [];
	for (var i = 0; i < n; i++) {
		if (c[i].firstChild) {
			links[links.length] = fullLinks[c[i].firstChild.id]; 
		}
	}
	return links;
}

function keep() {
	var links = getFaveLinks();
	var w = window.open('','','width=300,height=300,scrollbars=1');
//	w.open();
	w.document.write('<html><title>Selected Images</title><body><p>'+links.join("<br>")+'</p></body></html>')
//	w.close();
	return false;
}

function shareByMail() {
	var links = getFaveLinks();
	var html = '';
	html += 'I found these stock photos at the http://www.xcavator.net stock photography search portal:' + "\r\n\r\n";
	var ids = getFaveIds();
	var l;
	for (var i =0, l = ids.length; i < l; i++) {
		html += fullLinks[ids[i]] + "\r\n";
	}
/*
	var html = '<html><head>';
	html += '</head><body>';
	html += '<p>I found these stock photos at the <a href="http://www.xcavator.net">www.xcavator.net</a> stock photography search portal:</p>';
	var ids = getFaveIds();
	var l;
	for (var i =0, l = ids.length; i < l; i++) {
		html += '<a href="'+fullLinks[ids[i]]+'">'+fullLinks[ids[i]]+'</a><br/>';
	}
	html += '</body></html>';
*/
	document.getElementById('share_link').href = 'mailto:?subject=' + escape('Check out these stock photos')+'&body=' + escape(html);
	return true;
}

function mouseoutPreviewEvent(e) {
	var el = $('preview_mouse');
	if (e.type != 'mouseout' && e.type != 'mouseover') return false;
	var rel = e.relatedTarget ? e.relatedTarget :  e.toElement ;
	while (rel && rel != el) rel = rel.parentNode;
	if (rel && rel == el) {
		return;
	}
	hidePreview(e);
}

function mousemoveImg (e) {
	skip_preview = false;
}

function mouseupImg(e) {
	if (skip_preview || after_drag) {
//		skip_preview = false;
		return;
	}
	overImage = Event.element(e);
	overImageWait = false;
	showPreview(overImage);
}

function mouseoverImg(e) {
	if (skip_preview || after_drag ) {
		return;
	}
	var el = Event.element(e);
	if (overImage && overImage.id == el.id) {
		return;
	}
	if (previewImageId == el.id.substr(1)) {
		return;
	}

	if ($('preview').style.display != 'none') {
		hidePreview(e);
	}

	overImage = el;
	overImageWait = true;
	clearTimeout(previewShowTimeout);
	previewShowTimeout = setTimeout(function (o) {
					return function() {
						if (!drag && overImage && o.id == overImage.id && overImageWait) {
							overImageWait = false;
							showPreview(overImage);
						}
					}
				} (overImage), 1000);
}

function mouseoutImg(e) {
	overImage = null;
}
function mousedownImg(e) {
	if ($('preview').style.display != 'none') {
		hidePreview(e);
		skip_preview = true;
	}
	overImage = null;
}

function hidePreview (e) {
	if (previewEffect && previewEffect.timer) {
		clearTimeout(previewEffect.timer);
	}
	if (previewShowTimeout) {
		clearTimeout(previewShowTimeout);
	}
	$('preview').style.display = 'none';
	if (isMSIE) {
		$('provider_select').style.visibility = 'visible';
	}
	releaseImage();
	
}

function copyEl2Clipboard(el) {
	el.contentEditable = 'true';
	var controlRange;
	if (document.body.createControlRange) {
		controlRange = document.body.createControlRange();
		controlRange.addElement(el);
		controlRange.execCommand('Copy');
	}
	el.contentEditable = 'false';
}


function copy2Clipboard(txt) {
	var o = $('flashcopier');
	o.innerHTML = '';
	o.innerHTML = '<embed src="/_clipboard.swf" FlashVars="clipboard='+encodeURIComponent(txt)+'" width="0" height="0" type="application/x-shockwave-flash"></embed>';;
}

function releaseImage (o) {
	if (!o) {
		o = $('preview_img_c').firstChild;
	}
	if (o) {
		o.parentNode.removeChild(o);
		o.style.position = 'static';
		o.style.display = 'none';

		o.style.width = '';
		o.style.height = '';

		if ($(previewImageC)) {
			$(previewImageC).appendChild(o);
			o.style.display = '';
		}
	}
	previewImageId = '';
}

function showBigPreview (img) {
	var pb = $('preview_big');
	if (img.parentNode.className == 'favecell') {
		pb.className = 'fave';
	} else {
		pb.className = '';
	}
	var bi = $('preview_big_img');
	if (isMSIE) {
		bi.style.display = 'none';
	}
	bi.src = previewBigLinks[img.id];
	$('preview_big_link').href = fullLinks[img.id];
	$('preview_big_link').innerHTML = fullLinks[img.id];
	if (isFavesFull()) {
		$('big_keep_btn').className = 'bbtndis';
	} else {
		$('big_keep_btn').className = 'bbtn';
	}

	previewBigImageId = img.id.substr(1);
	pb.style.display = 'block';
}

function hideBigPreview () {
	$('preview_big').style.display = 'none';
	$('preview_big_img').src = '/images/1x1.gif';
	previewImageId = '';
	previewBigImageId = '';
}

function showPreview (img) {
	if ($('preview').style.display == '') {
		hidePreview();
	}
	if (isMSIE) {
		$('provider_select').style.visibility = 'hidden';
	}

	var h = JQ(img).height();
	var w = JQ(img).width();

	var offset = Position.cumulativeOffset(img.parentNode);
	var x = offset[0] - 65;
	var y = offset[1] - (102 - h/2);

	if (img.parentNode.className == 'favecell') {
		y -= 40;
	}

	previewPosition = [x,y];

	previewImageC = img.parentNode.id;
	if (img.parentNode.className == 'favecell') {
		$('preview').className = 'fave';
	} else {
		$('preview').className = '';
	}
	if (isFavesFull()) {
		$('keep_btn').className = 'pbtndis';
	} else {
		$('keep_btn').className = 'pbtn';
	}
	releaseImage();
	img.parentNode.removeChild(img);
	$('preview_img_c').appendChild(img);
	$('preview_c').className = '';
	previewImageId = img.id.substr(1);


//	img.style.position = 'relative';
	img.style.left = 0;
	img.style.top = 0;

	var o = $('preview');
	o.style.left = x<0?0:x+'px';
	o.style.top = y<0?0:y+'px';
	o.style.display = '';

	if (isMSIE) {
		img.style.width = 2*w+'px';
		img.style.height = 2*h+'px';
		$('preview_c').className = 'visible';
	} else {
		img.style.width = w+'px';
		img.style.height = h+'px';
		
		new Rico.Effect.SizeAndPosition(img, null, null, 2*w, 2*h, 50, 2, {bindvar: 'previewEffect', complete: function(){$('preview_c').className = 'visible'; previewEffect = null;}} );
	}
}


var points = {};
var points_n = 0;
var DrawModeStarted = 0;
var DrawContainerXY = null;

function DrawModeAddPoint (x, y, x0, y0) {

	var box = $('sel_image');
	
	var id = 'd' + x0+'_'+y0;
	if (box  && points_n < 21 && (typeof points[id] == 'undefined')) {
		points[id] = 1;
		points_n ++;

		var img = document.createElement('IMG');
		img.setAttribute('src', 'images/dot.gif');
		img.setAttribute('id', id);
		img.className = 'dot';
		img.style.left = (x-4)+'px';
		img.style.top = (y-4)+'px';
		box.appendChild(img);
//		dot.innerHTML += img.outerHTML();
	}
}


function nullFunc() {
	return false;
}


function DrawModeStart (e) {
	if (xc_search.allow_draw == 0) {
		return;
	}
	Event.stop(e);
	if (!DrawModeStarted) {
		DrawModeStarted = 1;
		DrawContainerXY = null;
//		DrawModeMouseMove(e); //emulate click event
	}
}


function DrawModeMouseMove (e) {
	Event.stop(e);
	if (DrawModeStarted == 0) {
		return;
	}


		
	var position = {x: Event.pointerX(e), y: Event.pointerY(e) };
	if (!DrawContainerXY) {
		DrawContainerXY = Position.cumulativeOffset(Event.element(e));
		DrawContainerXY[2] = Event.element(e).width;
		DrawContainerXY[3] = Event.element(e).height;
	}

	var position0 = new Object();
	position0.x  = position.x - DrawContainerXY[0];
	position0.y  = position.y - DrawContainerXY[1];
	if (position0.x < 0 || position0.y < 0 || position0.x > DrawContainerXY[2] || position0.y > DrawContainerXY[3]) {
		return;
	}

	DrawModeAddPoint (position.x, position.y, position0.x, position0.y);
}



function DrawModeMouseClick (e) {
	if (xc_search.allow_draw == 0) {
		return;
	}
	Event.stop(e);
	DrawModeStarted = 1;
	DrawModeMouseMove(e);
	DrawModeStarted = 0;
}


function DrawModeEnd (e) {

	if (DrawModeStarted) {
		DrawModeStarted = 0;
		setTimeout (DrawModeEndAsync, 100);
	}
}


function __debug(msg) {
	var d = new Date();
	$('debug').innerHTML = d.getMinutes() + ":" + d.getSeconds() + ':' +d.getMilliseconds() + '&nbsp;' + msg + '<Br/>' + $('debug').innerHTML;
}

function DrawModeEndAsync () {
	var offsetX = 0;
	var offsetY = 0;
	var dline = '';
	var c = null;
	var a = null;
	for (var id in points) {
		c = $(id);
		if (c) {
//			c.parentNode.removeChild(c);
			a = id.substr(1).split('_');
			dline += ((parseInt(a[0])+offsetX) + ';' + (parseInt(a[1])+offsetY) + ';');
		}
	}
	xc_search.updateSelectedImage({mode: 'add_points', sequence: dline.substr(0,dline.length-1)});
//	setTimeout(DrawModeClearDots, 500);
}

function DrawModeClearDots() {
	for (var id in points) {
		c = $(id);
		if (c) {
			c.parentNode.removeChild(c);
		}
	}
	points = {};
	points_n = 0;
}






//upload


uploadStart = function(fileObj) {
	
	var link = $('_mmSWFUploadLink');
	link.className = 'uploadLinkProgress';
	link.innerHTML = '<span class="c">Uploading...</span>';
}

uploadProgress = function(fileObj, bytesLoaded) {
	var progress = $('upload');
	var percent = Math.ceil((bytesLoaded / fileObj.size) * 100)
	progress.style.backgroundPosition = "-" + (170/100 * (100 - percent)) + "px 0";
	
}

uploadComplete = function(fileObj) {

	xc_search.updateSelectedImage({mode: 'upload'});
	restoreUploadButton();
}

uploadError = function(errcode, file, msg) {
	switch (errcode) {
		case -50:	// Filesize too big
			msg = 'File size should be less than 50k';
		break;
	}
	alert(file.name + ", " + msg);
	restoreUploadButton();
}

uploadCancel = function() {
}

restoreUploadButton = function () {	
	var link = $('_mmSWFUploadLink');
	link.className = 'btn'; //
	link.innerHTML = '<span class="l"></span><span class="c">Upload image</span><span class="r"></span>';
}




// mode:tags/image/color/cat_id,prov_id/start
var xc_url = {
	tags: '',
	image: '',
	color: '#000000',
	cat_id: '',
	prov_id: '',
	mode: 'image/tags',
	start: 0,

	getModePath: function(mode) {
		var m = xc_url.mode.split('/');
		if (m[1] == mode) {
			return xc_url.mode;
		}
		if ((m[1] == 'color' || m[1] == 'image') && (mode == 'color' || mode == 'image') ) {
			return m[0]+'/'+mode;
		}
		return m[1]+'/'+mode;
	},

	save: function (params) {
		if (typeof params == 'undefined') {
			window.location.href = '#';
			xc_url.tags = '';
			xc_url.image = '';
			xc_url.color = xc_search.color;
			xc_url.cat_id = xc_search.provider[0];
			xc_url.prov_id = xc_search.provider[1];
			xc_url.start = 0;
			xc_url.mode = 'image/tags';
			return;
		} 
		if (typeof params.image != 'undefined') {
			if (params.image == '') {
				params.image = xc_url.image;
			}
			params.mode = xc_url.getModePath('image');
		} else if (typeof params.color != 'undefined') {
			params.mode = xc_url.getModePath('color');
		} else if (typeof params.tags != 'undefined') {
			params.mode = xc_url.getModePath('tags');
		}
		for (var a in params) {
			if (typeof xc_url[a] != 'undefined') {
				xc_url[a] = params[a];
			}
		}
		var url = xc_url.mode + ':' + encodeURIComponent(xc_url.tags);
		url += '/' + xc_url.image + '/' + encodeURIComponent(xc_url.color);
		url += '/' + xc_url.cat_id + ',' + xc_url.prov_id;
		url += '/' + xc_url.start;
		window.location.href = '#'+url;
 		JQ.cookie('st', url, {expires: null});
		
	},

	parse: function (url) {
		var cs = url.split(':');
		xc_url.mode = cs[0]?cs[0]:'image/tags';
		cs = (cs[1]?cs[1]:'').split('/');
		xc_url.tags = cs[0]?decodeURIComponent(cs[0]):'';
		xc_url.image = cs[1]?cs[1]:'';
		xc_url.color = cs[2]?decodeURIComponent(cs[2]):xc_search.color;
		if (cs[3]) {
			cs[3] = cs[3].split(',');
			xc_url.cat_id = cs[3][0];
			xc_url.prov_id = cs[3][1];
		} else {
			xc_url.cat_id = xc_search.provider[0];
			xc_url.prov_id = xc_search.provider[1];
		}
		xc_url.start = cs[4]?cs[4]:0;
	},

	go: function(url) {
		xc_url.parse(url);
		xajax_setAllParams({
			cat_id: xc_url.cat_id,
			prov_id: xc_url.prov_id,
			image: xc_url.image,
			color: xc_url.color,
			tags: xc_url.tags,
			start: xc_url.start,
			mode: xc_url.mode,
			_callback: 'xc_search.updateResults(); xc_search.updateTags(); xc_search.updateImage();'
			});
		xc_search.tags = xc_url.tags;
		xc_search.syncTags();
		JQ.farbtastic('#picker').setColor(xc_url.color);
		var m = xc_url.mode.split('/');
		m = m[1]=='tags'?m[0]:m[1];
		xc_wm.mouseClick(m=='color'?'picker':m, 1);
	}
}

var xc_search = {
	image_path: 'imgs/',
	session_id: null,
	color: '#FFFFFF',
	updateInterval: null,

	updateTry: -1,
	updateMaxTries: 10,
	updateRequested: 0,

	tagsTry: -1,
	updateTagsMaxTries: 10,
	updateTagsRequested: 0,

	imageTry: -1,
	updateImageMaxTries: 10,
	updateImageRequested: 0,

	colorUpdateTimeout: null,
	search_image_enabled: 1,

	allow_draw: 0,

	tags_hl: 0,
	tags: '',
	tags_in_focus: 0,

	providers: {},
	provider: [],

	
	start: 0, //current start position


	changeProvider: function(provider_id, category_id) {
		if (typeof category_id != 'undefined') {
			var o = $('cat_lnk'+xc_search.provider[0]);
			if (o) {
				o.className = '';
				o.setAttribute('href', 'javascript: xc_search.changeProvider(0,'+xc_search.provider[0]+');');
			}

			xc_search.provider = [category_id, 0];
			var o = $('cat_lnk'+xc_search.provider[0]);
			o.className = 'disabled';
			o.setAttribute('href','javascript: ;');
			
			var opt = $('provider_select').options;
			opt.length = 0;
//			opt[opt.length] = new Option('All providers', 0);
			var ps = xc_search.providers[category_id].providers; 
			var p;
			for (p in ps) {
				if (p == "0" || parseInt(p)) {
					opt[opt.length] = new Option(ps[p], p);
				}
			}
			xc_url.save({cat_id:category_id, prov_id: opt[0].value, start: 0});
		} else {
			xc_search.provider[1] = provider_id;
			xc_url.save({prov_id: provider_id, start: 0});
		}
		xajax_setParams({mode: 'set_provider', category_id: xc_search.provider[0], provider_id: xc_search.provider[1], _callback: 'xc_search.updateResults();xc_search.updateTags();'});
	},


	matchPreview: function() {
		var id = previewImageId;
		hidePreview();
		xc_search.updateSelectedImage( {mode: 'select', id: id} );
		skip_preview = true;
		xc_wm.mouseClick('image', 1, 1);
//		setTimeout('skip_preview = false;', 10);
	},

	compPreview: function() {
		var id = previewImageId;
		hidePreview();
		showBigPreview($('p'+id));
	},

	addPreviewToFaves: function () {
		if ($(previewImageC).className == 'favecell') {
			return;
		}
		var c = document.getElementsByTagAndClassName('div','favecell');
		var n = c.length;
		var ids = [];
		for (var i = 0; i < n; i++) {
			if (!c[i].firstChild && c[i].id != 'trash') {
				previewImageC = c[i].id;
				var id = previewImageId;
				hidePreview();
				xc_search.addFave(c[i].id.substr(1),'p'+id);

				var n = dndXCavator.draggables.length;
				for (var j = 0; j < n; j++) {
					if (dndXCavator.draggables[j].id == 'p'+id) {
						dndXCavator.draggables[j].fave = i;
						break;
					}
				}

				break;
			}
		}
		skip_preview = true;
	}, 

	addBigPreviewToFaves: function() {
		if ($('p'+previewBigImageId).parentNode.className == 'favecell') {
			return;
		}
		var c = document.getElementsByTagAndClassName('div','favecell');
		var n = c.length;
		var ids = [];
		for (var i = 0; i < n; i++) {
			if (!c[i].firstChild && c[i].id != 'trash') {
				previewImageC = c[i].id;
				var id = previewBigImageId;
				releaseImage($('p'+id));
				xc_search.addFave(c[i].id.substr(1),'p'+id);

				var n = dndXCavator.draggables.length;
				for (var j = 0; j < n; j++) {
					if (dndXCavator.draggables[j].id == 'p'+id) {
						dndXCavator.draggables[j].fave = i;
						break;
					}
				}

				break;
			}
		}
		skip_preview = true;
	},

	orderPreview: function () {
		openFull();
		hidePreview();
		skip_preview = true;
//		setTimeout('skip_preview = false;', 50);
	},

	movePreviewToTrash: function () {
		var id = previewImageId;
		previewImageC = 'p'+id+'_prv';
		hidePreview();

		var n = dndXCavator.draggables.length;
		for (var i = 0; i < n; i++) {
			if (dndXCavator.draggables[i].id == 'p'+id) {
				dndXCavator.draggables[i].fave = -1;
				break;
			}
		}

		skip_preview = true;
//		setTimeout('skip_preview = false;', 50);

		xc_search.removeFave(id, 'image_id');
	},

	moveBigPreviewToTrash: function () {
		var id = previewBigImageId;
		previewImageC = 'p'+id+'_prv';
		releaseImage($('p'+id));
		var n = dndXCavator.draggables.length;
		for (var i = 0; i < n; i++) {
			if (dndXCavator.draggables[i].id == 'p'+id) {
				dndXCavator.draggables[i].fave = -1;
				break;
			}
		}
		skip_preview = true;

		xc_search.removeFave(id, 'image_id');
	},

	addFave: function (place, id) {
		$(trashAreaId).className = $(trashAreaId).className.replace(/ disabled/, '');
		JQ.cookie('fave_id['+place+']',id.substr(1),{expires: 300});
	},

	removeFave: function (id, mode) {
		if (favesIsEmpty() && $(trashAreaId).className.search(/ disabled/) == -1 ) {
			$(trashAreaId).className += ' disabled';
		}
		if (mode == 'image_id') {
			var n = document.getElementsByTagAndClassName('div','favecell').length;
			for (var i = 0; i < n; i++) {
				if (JQ.cookie('fave_id['+i+']') && JQ.cookie('fave_id['+i+']') == id) {
					JQ.cookie('fave_id['+i+']',null);
				}
			}
		} else {
			JQ.cookie('fave_id['+id+']',null);
		}
	},

	showResults: function (count, start, limit, data, count_total) {
		overImage = null;

		xc_search.updateRequested = 0;
		$('preloader').style.visibility = 'hidden';
		xc_search.unhlTagsArea();

		start = Number(start);
		limit = Number(limit);
		count = Number(count);

		var html = '';

		var temp = {f:{},p:{}};
		var faves = getFaveIds();
		for (var i=0; i < faves.length; i++) {
			temp.f[faves[i]] = fullLinks[faves[i]];
			temp.p[faves[i]] = previewBigLinks[faves[i]];
		}
		fullLinks = temp.f;
		previewBigLinks = temp.p;
		
		var faves = getFaveIds();
		var n = data.length;
		for (var i=0; i < n; i++) {
			if (faves.indexOf('p'+data[i].id) == -1) {
				html += '<div class="prv" id="p'+data[i].id+'_prv"><img id="p'+data[i].id+'" class="draggable" src="'+data[i].small+'" alt=""/></div>';
				fullLinks['p'+data[i].id] = data[i].link;
				previewBigLinks['p'+data[i].id] = data[i].preview;

			} else {
				html += '<div class="prv" id="p'+data[i].id+'_prv"></div>';
			}
		}
		if (data.length < 1) {
			html = '<div class="msg"><h1 style="text-align: center; margin-top: 40px; color: #505050">No matching items are found.</h1></div>';
		}
		$('list').innerHTML = html;
		
		var c = document.getElementsByTagAndClassName('img','draggable');
		xc_search.init_clicks( c , getFaveIds());
		//re-init DnD
		initDnd.clearDraggables();
		initDnd.clearPrevs();
		initDnd.setDraggables(c);
		initDnd.setPrevs(document.getElementsByTagAndClassName('div','prv'));

		var o;
		if (start > limit) { //third or more page
			$('pager_first').className = '';
			$('pager2_first').className = '';
		} else {
			$('pager_first').className = 'disabled';
			$('pager2_first').className = 'disabled';
		}

		if (start > 0) { //second
			$('pager_previous').className = '';
			$('pager_previous').href="?start="+(start-limit < 0 ?0:start-limit);
			$('pager2_previous').className = '';
			$('pager2_previous').href="?start="+(start-limit < 0 ?0:start-limit);
		} else {
			$('pager_previous').className = 'disabled';
			$('pager2_previous').className = 'disabled';
		}

		if (start < count-limit) {
			$('pager_next').className = '';
			$('pager_next').href="?start="+(start+limit);
			$('pager2_next').className = '';
			$('pager2_next').href="?start="+(start+limit);
		} else {
			$('pager_next').className = 'disabled';
			$('pager2_next').className = 'disabled';
		}
		var page = Math.ceil(start/limit)+1;
		var pages = Math.ceil(count_total/limit);
		$('pager_head').innerHTML = 'Page ('+page+'/'+pages+'):';
		$('pager2_head').innerHTML = 'Page ('+page+'/'+pages+'):';


	},

	go: function(o) { //navigation throw results
		if (o.className != 'disabled') {
			var start = o.href.match(/start=(\d+)/);
			var start = start[1];
			$('preloader').style.visibility = '';
			xajax_getResults(start,0); //0 - for server side limit 
			xc_url.save({start:start});
		}
		return false;
	},
	
	updateSelectedImage: function(params) {
//		var time = new Date;
//		time = time.getTime();
		switch (params.mode) {
			case 'upload': 
					xc_url.save({image:'user', start: 0});
				break;
			case 'select': 
					xc_url.save({image: params.id, start:0 });
				break;
			case 'clear': 
					xc_url.save({image: 'none', start: 0});
				break;
		}
		xc_search.imageReady_callback = function (params) { return function () {
							switch (params.mode) {
								case 'upload':
										setTimeout(xajax_syncColor, 100);
										xc_wm.mouseClick('image', 1, 1);
									break;
								case 'select':
										setTimeout(xajax_syncColor, 100);
//										if (params.id) {
											xc_search.updateTags();
//										}
									break;
								case 'add_points':
									break;
								case 'set_color':
									break;
								case 'clear':
										xc_search.updateTags();
									break;
								case 'reset':
									break;
								case 'update':
									break;
								default:
										return;
							} 
							xc_search.updateResults();
					}}(params);
		params._callback = 'xc_search.updateImage();';
		xajax_setParams(params);
	},

	init_clicks: function (c, skip_ids) {
		var n = c.length;
		for (var i = 0; i < n; i++) {
			if (skip_ids.indexOf(c[i]) == -1) {
				c[i].ondblclick = function (id) {return function() {skip_preview = true; openFull(id.substr(1)); }} (c[i].id); //safari 2 bug with dblclick throw addEventListener


				Event.observe(c[i], 'click', mouseupImg, false);
				Event.observe(c[i], 'mouseover', mouseoverImg, false);
				Event.observe(c[i], 'mousemove', mousemoveImg, false);
				Event.observe(c[i], 'mouseout', mouseoutImg, false);
				Event.observe(c[i], 'mousedown', mousedownImg, false);


			}
		}
	},

	updateResults: function () {
		var d = new Date();
		if (!xc_search.updateRequested || xc_search.updateRequested < d.getTime() - 10000) {
			$('preloader').style.visibility = '';
			xc_search.updateTry = 1;
			xc_search.updateRequested = d.getTime();
			xc_search.resultNotReady();
		}
	},

	updateResultsTry: function () {
		xajax_getResults(xc_url.start,0);
	},

	resultNotReady: function () {
		if (xc_search.updateTry++ < xc_search.updateMaxTries) {
			if (xc_search.updateTry == 2) { //first try
				xc_search.updateResultsTry();
			} else {
				setTimeout(xc_search.updateResultsTry, 2000);
			}
		} else {
			xc_search.updateRequested = 0;
//			alert('fail to update data');
		}
	},

	tagsSubmit: function () {
//		xc_search.unhlTagsArea();
		var v = $('search_tags').value;
		if (v == '' && !xc_search.tags_in_focus) {
			$('search_tags').value = 'Add keywords';
			xc_search.unhlTagsArea();
		}
		if (v == 'Add keywords') {
			v = '';
		}
		xc_search.searchByTags(v);
		xc_search.tags = v;
		xc_url.save({tags:v, start:0});
		xc_wm.mouseClick('tags');
	},

	tagsFocus: function () {
		xc_search.tags_in_focus = 1;
		xc_search.hlTagsArea();
		var v = $('search_tags').value;
		if (v == 'Add keywords') {
			$('search_tags').value = '';
		}
		xc_search.tags = $('search_tags').value;
	},

	tagsBlur: function () {
		xc_search.tags_in_focus = 0;
		xc_search.unhlTagsArea();
	},

	tagClick: function (tag) {
		var o = $('search_tags');
		o.focus();
		if (o.value == 'Add keywords' || o.value.length == 0) {
			o.value = tag;
		} else {
			o.value += ' ' + tag;
		}
		xc_search.tags = o.value;
		xc_url.save({tags: o.value, start: 0});
		xc_search.searchByTags(o.value);
		xc_wm.mouseClick('tags');
		return false;
	},

	hlTagsArea: function () {
		if (!xc_search.tags_hl) {
//			var o = $('search_loupe');
//			if (o) {
//				o.src = 'images/search_bg1_hl.jpg';
//			}
			$('search_tags').className = 'hl';
//			$('search_submit').src = $('search_submit').src.replace(/submit\.(\w+)$/, "submit_hl.$1");
			xc_search.tags_hl = 1;
		}
	},

	unhlTagsArea: function () {
		if (xc_search.tags_hl) {
//			var o = $('search_loupe');
//			if (o) {
//				o.src = 'images/search_bg1.jpg';
//			}
			$('search_tags').className = '';
//			$('search_submit').src = $('search_submit').src.replace(/submit_hl\.(\w+)$/, "submit.$1");
			xc_search.tags_hl = 0;
		}
	},

	searchByTags: function (tags) {
		xajax_setParams({mode: 'set_tags', search_tags: tags, _callback: 'xc_search.updateResults();xc_search.updateTags();xc_search.updateImage();'});
	},

	updateTags: function () {
		var d = new Date();
		if (!xc_search.updateTagsRequested || xc_search.updateTagsRequested < d.getTime() - 10000) {
			xc_search.tagsTry = 1;
			xc_search.updateTagsRequested = d.getTime();
			xc_search.tagsNotReady();
		}
	},

	updateTagsTry: function () {
		xajax_getTags();
	},

	tagsNotReady: function () {
		if (xc_search.tagsTry++ < xc_search.updateTagsMaxTries) {
			if (xc_search.tagsTry == 2 ) { //first try
				xc_search.updateTagsTry();
			} else {
				setTimeout(xc_search.updateTagsTry, 2000);
			}
		} else {
			xc_search.updateTagsRequested = 0;
//			alert('fail to update tags');
		}
	},
		
	
	showTags: function(tags) {
		xc_search.updateTagsRequested = 0;
		var l = tags.length;
		var s = '';
		for (var i = 0; i < l; i++)	{
			if (tags[i].title == "") {
				s += '<br/>';
			} else {
				s += '<a href="?mode=set_tag&id= '+ escape(tags[i].title) + '"' + (tags[i].pop?'class="pop'+tags[i].pop:'')+'" onClick="return xc_search.tagClick(\''+tags[i].title.replace("'","\\'")+'\');">'+tags[i].title+'</a> ';
			}
		}
		$('tags').innerHTML = s;
	},

	syncTags: function() {
		if (xc_search.tags == '') {
			$('search_tags').value = 'Add keywords';
		} else {
			$('search_tags').value = xc_search.tags;
		}
	},

	updateImage: function () {
		var d = new Date();
		if (!xc_search.updateImageRequested || xc_search.updateImageRequested < d.getTime() - 10000) {
			$('preloader').style.visibility = '';
			xc_search.imageTry = 1;
			xc_search.updateImageRequested = d.getTime();
			xc_search.imageNotReady();
		}
	},

	updateImageTry: function () {
		xajax_getImage();
	},

	imageNotReady: function () {
		if (xc_search.imageTry++ < xc_search.updateImageMaxTries) {
			if (xc_search.imageTry == 2) {//first try
				xc_search.updateImageTry();
			} else {
				setTimeout(xc_search.updateImageTry, 1000);
			}
		} else {
			xc_search.updateImageRequested = 0;
//			alert('fail to update image');
		}
	},

	showImage: function(url, allow_draw) {
		xc_search.updateImageRequested = 0;
		$('selected_image').src = url;
		xc_search.allow_draw = allow_draw;
		if (allow_draw == 0) {
//			$('image_disabler').className = 'disabled';
//			$('selected_image').className = 'disabled';
		} else {
//			if ($('image_disabler').className == 'disabled') {
//				$('image_disabler').className = '';
//			}
			if ($('selected_image').className == 'disabled') {
				$('selected_image').className = '';
			}
		}
		$('selected_image').style.display = '';
		DrawModeClearDots();
		if (xc_search.imageReady_callback) {	
			xc_search.imageReady_callback();
		}
	},

	updateColorFromInput: function (e) {
		var color = $('picker_v').value;
		if (xc_search.color != color && /^#[0-9A-F]{6}$/i.test(color)) {
			xc_search.updateColorImmediatly(color);
		}
	},

	updateColorImmediatly: function (color, callback) {
		xc_search.color = color;
		if (typeof callback == 'undefined') {
			callback = 'xc_search.updateResults();';
		}
		xc_url.save({color: color, start: 0});
		xajax_setParams({mode: 'set_color', color: color, _callback: callback});
	},

	updateColor: function (color) {
		if (xc_search.color != color) {
			xc_search.color = color;
			if (xc_search.colorUpdateTimeout) {
				clearTimeout(xc_search.colorUpdateTimeout);
			}
			xc_search.colorUpdateTimeout = setTimeout(function(color){ return function () { 
									if (!document.dragging ) { //farbastic 
										xc_search.updateColorImmediatly(color);
									}
								}
							}(color), 1000);
		}
	},

	startNewSearch: function() {

		var ps = {
			'image': 'none',
			'tags': '',
			'color': '',
			'mode': 'image/tags'
		};

		ps._callback = 'xc_search.updateResults(); xc_search.updateTags(); xc_search.updateImage();';
		xc_search.tags = '';
		xc_url.save();
		xajax_setAllParams(ps);

		xc_wm.mouseClick('image', 1);
	},

	syncColor: function (c) {
		var s = '#';
		var a = '' + Number(c.r).toString(16);
		if (a.length < 2)  {
			a = '0'+a;
		}
		s += a;
		var a = '' + Number(c.g).toString(16);
		if (a.length < 2)  {
			a = '0'+a;
		}
		s += a;
		var a = '' + Number(c.b).toString(16);
		if (a.length < 2)  {
			a = '0'+a;
		}
		s += a;
		$('picker_v').value = s.toUpperCase();
		$('picker').farbtastic.setColor(c);
	},

	showLoading: function () {
		Event.observe(window, 'mousemove', xc_search.dragLoadInd);
		$('load_ind').style.display = '';
	},

	dragLoadInd: function (event) {
		$('load_ind').style.left = Event.pointerX(event)-23;
		$('load_ind').style.top = Event.pointerY(event)-20;
	},

	hideLoading: function() {
		$('load_ind').style.display = 'none';
		Event.stopObserving(window, 'mousemove', xc_search.dragLoadInd);

	},
	error: function(code) {
		xc_search.updateRequested = 0;	
		$('preloader').style.visibility = 'hidden';
		switch (code) {
			case '1':
					location.reload();
				break;
			case '2':
					$('list').innerHTML = '<div class="msg"><h1>Hello! We apologize, but your session was terminated to make room for other users.<br/>This happens after 2 minutes of inactivity.</h1><h1><a href="/">Click here</a> to start new session.</h1></div>';
				break;
		}
		
	}
}
var xc_wm = {
	state_changed: 0,
	mode: '',
	active: '',
	over: '',
	show_help: 1,
	help_mode: '',
	help_to: 0,
	help_allow_hide: 0,
	

	help_data: {
		traces: {cid:'image_box',text:'',left:-200,top:0}
		},

	toogleMode: function (o) {
		if (o.innerHTML == 'Basic Search') {
			$('head_row').className = 'basic';
			$('picker_box').style.display = 'none'; //fckng IE;
			o.innerHTML = 'Advanced Search';
			xc_wm.mouseClick('image');
		} else {
			$('head_row').className = 'advanced';
			$('picker_box').style.display = ''; //fckng IE;
			o.innerHTML = 'Basic Search'
		}
		JQ.cookie('iface_mode',$('head_row').className,{expires: 300});
	},

	activate: function(mode) {
		switch (mode) {
			case 'picker':
					xc_search.updateColorImmediatly($('picker_v').value, 'xc_search.updateTags();xc_search.updateResults();');
				break;
			case 'image':
					xc_search.updateSelectedImage({mode: 'select', id: 0});
				break;
		}
	},

	mouseOver: function (mode, force ) {
		if (xc_wm.show_help) {
			xc_wm.help_mode = mode;
			if (xc_wm.help_to) {
				clearTimeout(xc_wm.help_to);
			}
			xc_wm.help_to = setTimeout(function(m) {return function(){xc_wm.showHelp(m)};} (mode), 2000);
		}
		if ($(mode+'_disabler')) {
			if (mode == 'image' && xc_search.allow_draw==0 && !force) {
				return;
			}
			$(mode + '_disabler').className = 'transparent';
			if (!after_drag) {
				xc_wm.over = mode;
			}
		}
	}, 

	mouseOut: function (mode) {
		if ($(mode+'_disabler')) {
			if ($(mode + '_disabler').className == 'transparent') {
				$(mode + '_disabler').className = '';
			}
		}
//		xc_wm.help_mode = '';
//		xc_wm.hideHelp();
	},

	mouseClick: function (mode, skip_activation, force) {
		if (!mode) {
			mode = xc_wm.mode;
		}
		var changed = (mode != xc_wm.active);
		switch (mode) {
			case 'picker':
					if (!after_drag /*xc_wm.over == mode*/) {
						$('picker_disabler').style.display = 'none';
						$('image_disabler').style.display = '';
						$('picker_box').className = 'active';
						$('image_box').className = '';
						xc_search.syncTags();
					}
				break;
			case 'image':
//					if (xc_search.allow_draw == 0 && !force) {
//						return;
//					}
					$('picker_disabler').style.display = '';
					$('image_disabler').style.display = 'none';
					$('picker_box').className = '';
					$('image_box').className = 'active';
					xc_search.syncTags();
				break;
			case 'tags':
				break;
			default:
					$('picker_box').className = '';
					$('image_box').className = '';
					$('picker_disabler').style.display = '';
					$('image_disabler').style.display = '';
				break;
		}

		JQ.cookie(xc_search.cookie_pfx + 'wm_mode',mode,{expires: 300});
		if (skip_activation) {	
			xc_wm.active = mode;
		} else if (!after_drag/*xc_wm.over == mode &&*/ && changed) {
			xc_wm.active = mode;
			xc_wm.activate(mode);
		}
	},

	showHelp: function (mode) {
		if (xc_wm.help_mode == mode && xc_wm.help_data[mode]) {
//			$('help').innerHTML = xc_wm.help_data[mode].text.replace(/\n/gi,'<br\/>');

			var o = $('help_block');

//			var p = Position.cumulativeOffset($(xc_wm.help_data[mode].cid));
			var p = [0,0]; // for absolute-positioned parent
			o.style.left = p[0] + xc_wm.help_data[mode].left + 'px';
			o.style.top = p[1] + xc_wm.help_data[mode].top + 'px';
			o.style.display = '';
			xc_wm.help_allow_hide = 1;
//			setTimeout(function () {xc_wm.help_allow_hide = 1}, 1000);
		}
	},

	hideHelp: function() {
		if (xc_wm.help_allow_hide) {
			$('help_block').style.display = 'none';
		}
	},

	toogleHelp: function () {
		xc_wm.show_help = $('show_help').checked?1:0;

		JQ.cookie('hide_help',(xc_wm.show_help?0:1),{expires: 300});
		if (xc_wm.show_help) {
			$('help_block').className = '';
		} else {
			xc_wm.hideHelp();
//			$('help_block').className = 'disabled';
		}

	}
}
