var photoviewer_properties = {next:"next", prev:"prev", close:"<div class='b_outer2'><div class='b4 closeIcon'></div></div>"};

function popup(url) {window.open(url, "name","height=550,width=750,left=30,top=30,location=no,resizable=yes,scrollbars=yes,toolbar=no,status=no");}
function move(url) {window.location = url;}

function form_submit(form_element, add_fields) {
	var form_element = Y$(form_element);
	if(!form_element) return false;
	if(add_fields) {
		for(key in add_fields) {
			new Insertion.Bottom(form_element,
				'<input type="hidden" name="' + key + '" value="' + add_fields[key] + '" />'
			);
		}
	}
	return form_element.submit();
}

function toggleOver(element_id, class_name) {
	Y$(element_id).className = class_name;
}

function search_onfocus(element, default_text) {
	if (Y$(element).value == default_text) {
		Y$(element).value = "";
	}
	Y$(element).style.color = "#000";
}

function search_onblur(element, default_text) {
	Y$(element).value = default_text;
	Y$(element).style.color = "#ccc";
}

function search_close(element, default_text, target) {
	search_onblur(element, default_text);
}

function showException(originalRequest, exception) {
	log_error("ajax exception: " + exception,'','');
}

function rate_design(design_id, action) {
	var url = Y$('rateform_' + design_id).action;
	var params = "design_id=" + design_id;
	if (action == 'rate_up') {
		params += "&rate_up=1";
	} else {
		params += "&rate_down=1";
	}
	YC.asyncRequest( 'GET', url, {
		success: function (o) {
			if (!rating) return;
			Y$('thanks_' + design_id).show();
			Y$('rating_up_' + design_id).innerHTML = rating['positive'];
			Y$('rating_down_' + design_id).innerHTML = Math.abs(rating['negative']);
			Y$('rateform_' + design_id).disable();
		},
		failure: showException,
		argument:null
	}, null);
}

function add_favorite_design(design_id, url) {
	YC.asyncRequest( 'POST', url, {
		success: function (o) {
			Y$('button_fav_' + design_id).className = "button_favorite";
			Y$('button_fav_' + design_id).title = o.responseText;
		},
		failure:showException,
		argument:null
	}, "add=1&design_id=" + design_id);
}

function remove_favorite_design(design_id, url) {
	YC.asyncRequest( 'POST', url, {
		success: function (o) {
			Y$('button_fav_' + design_id).className = "button_favorite_add";
			Y$('button_fav_' + design_id).title = o.responseText;
		},
		failure:showException,
		argument:null
	}, "remove=1&design_id=" + design_id);
}

function toggle_favorite_design(design_id, url) {
	if (Y$('button_fav_' + design_id).className.substring(0, 19) == 'button_favorite_add') {
		return add_favorite_design(design_id, url);
	} else {
		return remove_favorite_design(design_id, url);
	}
}

function hide_select_controls() {
	var elements = Y$$('SELECT'); if (elements) for(var i=0; i<elements.length; i++) Y$(elements[i]).hide();
}

function show_select_controls() {
	var elements = Y$$('SELECT'); if (elements) for(var i=0; i<elements.length; i++) Y$(elements[i]).show();
}

function remind_me_design(design_id, date, url, onComplete) {
	YC.asyncRequest( 'POST', url, {
		success: onComplete,
		failure:showException,
		argument:null
	}, "design_id=" + design_id + "&date[year]=" + date.year + "&date[month]=" + date.month + "&date[day]=" + date.day);
}

function reorder_images(album_id, order_list, url, onComplete) {
	YC.asyncRequest( 'POST', url, {
		success: onComplete,
		failure:showException,
		argument:null
	}, "album_id=" + album_id + "&order=" + YJSON.stringify( order_list));
}

function post_ajax_yui(postData, sUrl, onComplete, onFailure, sCope) {
	var __onFailure = onFailure || function( eventType, args) {
		log_error('post_ajax_yui: onFailure: sUrl:' + sUrl + ', postData:' + postData, sUrl, '');
	}
	var conn = YC.asyncRequest('POST', sUrl, {
		success: function(eventType, args) {
			// If redirect
			if (eventType.responseText.indexOf("REDIRECT TO: ") == 0) {
				location.href = eventType.responseText.replace("REDIRECT TO: ", "");
				return true;
			}
			onComplete.call(sCope, eventType, args);
		},
		failure: function(eventType, args) {
			if ( eventType.status == -1 ) {
				log_error('post_ajax_yui: abort call: sUrl:' + sUrl + ', postData:' + postData, sUrl, '');
			}
			__onFailure.call(sCope, eventType, args);
		},
		argument: null,
		scope: sCope,
		timeout: 60000 	// abort in 60 sec
	}, postData);
	conn.abort = function() {
		YC.abort(this);
		__onFailure.call(sCope, {status:-1}, null);
	}
	return conn;
}

function post_ajax(params, url, onComplete, onFailure) {
	return YC.asyncRequest('POST', url, {
		success: onComplete,
		failure: showException,
		argument:null
	}, params);
}

function post_effects(image_id, params, url, onComplete, onFailure) {
	if (typeof(onFailure) != 'function') {
		onFailure = showException;
	}

	YC.asyncRequest('POST', url, {
		success: onComplete,
		failure: onFailure,
		argument:null
	}, "image_id=" + image_id + "&params=" + YJSON.stringify(params));
}

function show_preview_image(src) {
	hide_select_controls();
	Y$('preview_image_big').src = src;
	Y$('preview_image_big_container').show();
	Y$('preview_image_big_container').scrollTo();
}
function hide_preview_image() {
	Y$('preview_image_big_container').hide();
	Y$('preview_image_big').src = "/s/img/loading-v1275468890.gif";
	show_select_controls();
}

var visible_price_list = false;
function show_price_list(id) {
	if (visible_price_list && Y$(visible_price_list)) {
		Y$(visible_price_list).hide();
		visible_price_list = false;
	}
	if (id && Y$(id)) {
		Y$(id).show();
		visible_price_list = id;
	}
}
var visible_spec_list = false;
function show_spec_list(id) {
	if (visible_spec_list && Y$(visible_spec_list)) {
		Y$(visible_spec_list).hide();
		visible_spec_list = false;
	}
	if (id && Y$(id)) {
		Y$(id).show();
		visible_spec_list = id;
	}
}

function is_email(email) {
	var regularExp = /^[0-9a-z_\-]+@[0-9a-z_\^\.\-]+\.[a-z]{2,3}$/i;
	return regularExp.test(email);
}

function window_stop(src) {
	try {
		if (document.all) {
			src.document.execCommand("Stop"); 	// If IE
		} else {
			src.window.stop();					// If no IE
		}
	} catch(e) {}
}

/*YUI Begin*/
window.YAHOO && (function(){

	Y = YAHOO;
	YU = Y.util;
	YA = YU && YU.Anim;
	YD = YU && YU.Dom;
	YE = YU && YU.Event;
	YS = YU && YU.Selector;
	YC = YU && YU.Connect;
	YR = YU && YU.Region;

	YL = Y.lang;
	YJSON = YL && YL.JSON;

	var extend = function( o1, o2) {
		if ( o1 ) {
			for( var i in o2) {
				o1[i] = o2[i];
			}
		}
		return o1;
	}
	var stripTags = function(str) {
		return str.replace(/<\/?[^>]+>/gi, '');
	}
	var stripScripts =  function( str) {
		return this.replace(new RegExp('<script[^>]*>([\\S\\s]*?)<\/script>', 'img'), '');
	}
	var extractScripts = function() {
		var matchAll = new RegExp('<script[^>]*>([\\S\\s]*?)<\/script>', 'img');
		var matchOne = new RegExp('<script[^>]*>([\\S\\s]*?)<\/script>', 'im');
		var result = [];
		var res = (this.match(matchAll) || []);
		for( var i=0; i<res.length; i++) {
			result.push((res[i].match(matchOne) || ['', ''])[1]);
		}
		return result;
	}
	var evalScripts = function(str) {
		var scrs = extractScripts( str);
		for( var i=0; i<scrs.length; i++) {
			eval(scrs[i]);
		}
	}
	var addListenerLocal = function( eventName, handler, useCapture) {
			var useCapture = useCapture || false;
			YE.addListener( this, eventName, handler, useCapture);
			return this;
	}
	var YElement = {
		show : function() {
			YD.setStyle( this, "display", "");
			return this;
		},
		hide : function() {
			YD.setStyle( this, "display", "none");
			return this;
		},
		setStyle : function( property, value) {
			YD.setStyle( this, property, value);
			return this;
		},
		getStyle : function( property) {
			return YD.getStyle( this, property);
		},
		addListener : addListenerLocal,
		on : addListenerLocal,
		update : function(innerHTML) {
			if ( this.tagName ) {
				this.innerHTML = innerHTML;
			} else if( this.length ) {
				for( var i=0; i<this.length; i++) {
					Y$(this[i]).update( innerHTML);
				}
			}
			return this;
		},
		evalScripts : function() {
			if ( this.tagName ) {
				while( this.getElementsByTagName( "SCRIPT").length ) {
					var eval_script = this.getElementsByTagName("SCRIPT")[0].innerHTML;
					eval_script = eval_script.indexOf("<!--") == -1 ?
						eval_script :
						eval_script.substr(eval_script.indexOf("<!--") + 4);

					eval(eval_script);
					this.getElementsByTagName("SCRIPT")[0].parentNode.removeChild(this.getElementsByTagName("SCRIPT")[0]);
				}
			} else if( this.length ) {
				for( var i0=0; i0<this.length; i0++) {
					this.evalScripts();
				}
			}
			return this;
		},
		disable : function() {
			if ( this.tagName ) {
				if ( this.tagName.toLowerCase() == "form" ) {
					for( var i=0; i<this.elements.length; i++) {this.elements[i].disabled = true;}
				} else {
					this.disabled = true;
				}
			} else if( this.length ) {
				for( var i=0; i<this.length; i++) {Y$(this[i]).disable();}
			}
			return this;
		},
		enable : function() {
			if ( this.tagName ) {
				if ( this.tagName.toLowerCase() == "form" ) {
					for( var i=0; i<this.elements.length; i++) {this.elements[i].disabled = false;}
				} else {
					this.disabled = false;
				}
			} else if( this.length ) {
				for( var i=0; i<this.length; i++) {Y$(this[i]).enable();}
			}
			return this;
		},
		getWidth : function() {
			var region = YR.getRegion(this);
			return region["right"]-region["left"];
		},
		getHeight : function() {
			var region = YR.getRegion(this);
			return region["bottom"]-region["top"];
		},
		insertAfter : function(node) {
			if ( !node.tagName ) {
				var div = document.createElement( "div");
				div.innerHTML = node;
				node = Y$(div).down();
			}
			if ( this.tagName ) {
				node && YD.insertAfter( node, this);
			} else {
				if ( node ) {
					for( var i=0; i<this.length; i++) {
						YD.insertAfter( node, this);
						node = document.cloneNode( node, 1);
					}
				}
			}
			return this;
		},
		remove : function() {
			if ( this.tagName ) {
				this.parentNode.removeChild(this);
			} else {
				for( var i=0; i<this.length; i++) {
					this[i].parentNode.removeChild(this[i]);
				}
			}
			return this;
		},
		toggle : function(type) {
			YU.Effect.toggle( this, type);
			return this;
		},
		each : function(func) {
			if ( this.tagName ) {
				func(this);
			} else {
				for( var i=0; i<this.length; i++) {
					func(this[i]);
				}
			}
			return this;
		},
		replace : function( content) {
			if ( this.tagName ) {
				if ( content.tagName ) {
					this.parentNode.replaceChild( content, this);
				} else {
					var tmp = document.createElement("div");
					tmp.innerHTML = String(content);
					while( tmp.firstChild ) {
						this.parentNode.insertBefore( tmp.firstChild, this);
					}
					this.parentNode.removeChild(this);
				}
			} else if( this.length ) {
				var tmp = document.createElement("div");
				for( var i=0; i<this.length; i++) {
					if ( content.tagName ) {
						this[i].parentNode.replaceChild( content, this[i]);
					} else {
						tmp.innerHTML = String(content);
						while( tmp.firstChild ) {
							this[i].parentNode.insertBefore( tmp.firstChild, this[i]);
						}
						this[i].parentNode.removeChild(this[i]);
					}
				}
			}
			return this;
		},
		down: function() {
			var selector = arguments[0] || "*";
			if ( this.tagName ) {
				return extend( YS.query( selector, this)[arguments[1] || 0] || null, YElement);
			} else {
				var nodes = [];
				for( var i0=0; i0<this.length; i0++) {
					var childs = YS.query( selector, this[i0]);
					for( var i=0; i<childs.length; i++) {
						nodes.push( childs[i]);
					}
				}
				return extend( nodes[arguments[1] || 0] || null, YElement);
			}
		},
		up: function() {
			var selector = arguments[0] || "*";
			var nodes = [];
			if ( this.tagName ) {
				var o=this;
				do {
					o = o.parentNode;
					nodes.push( o);
				} while( o && o.parentNode && o.parentNode != o );
			} else {
				for( var i0=0; i0<this.length; i0++) {
					var o=this[i0];
					do {
						o = o.parentNode;
						nodes.push( o);
					} while( o && o.parentNode && o.parentNode != o );
				}
			}
			return extend( YS.filter( nodes, selector)[arguments[1] || 0] || null, YElement);
		},
		adjacent: function() {
			var selector = [].join.call( arguments, ",");
			var nodes = [];
			if ( this.tagName ) {
				var childs = this.parentNode.childNodes;
				for( var i=0; i<childs.length; i++) {
					if ( childs[i] != this ) {
						nodes.push( childs[i]);
					}
				}
			} else {
				for( var i0=0; i0<this.length; i0++) {
					var childs = this[i0].parentNode.childNodes;
					for( var i=0; i<childs.length; i++) {
						if ( childs[i] != this[i0] ) {
							nodes.push( childs[i]);
						}
					}
				}
			}
			return extend( YS.filter( nodes, selector), YElement);
		}
	};

	YU.Effect = {};
	YU.Effect.toggle = function( objs, type) {
		var objs = ( objs.tagName && [objs]) || objs;
		var type = type || "";
		switch( type ) {
			case 'blind': {
				for( var i=0; i<objs.length; i++) {
					if ( !(objs[i].EffectBlocked) ) {
						objs[i].EffectBlocked = 1;
						YU.Effect.blind( objs[i]);
					}
				}
				break;
			}
			default: {
				for( var i=0; i<objs.length; i++) {
					if ( !(objs[i].EffectBlocked) ) {
						YD.setStyle( objs[i], 'display', YD.getStyle( objs[i], 'display')=='none'?'':'none');
					}
				}
			}
		}
	}
	YU.Effect.blind = function( obj) {
		if ( YD.getStyle( obj, 'display') != 'none' ) {
			YD.setStyle( obj, 'overflow-y', 'hidden');
			var anim = new YA( obj, {height:{to:1}}, .5, YU.Easing.easeInStrong);
			anim.onComplete.subscribe( function(){
				YD.setStyle( obj, 'display', 'none');
				obj.EffectBlocked = 0;
			});
		} else {
			YD.setStyle( obj, 'overflow-y', 'hidden');
			YD.setStyle( obj, 'height', "1px");
			YD.setStyle( obj, 'display', '');
			var anim = new YA( obj, {height:{to:obj.scrollHeight}}, .5, YU.Easing.easeInStrong);
			anim.onComplete.subscribe( function(){
				YD.setStyle( obj, 'overflow-y', 'visible');
				YD.setStyle( obj, 'height', 'auto');
				obj.EffectBlocked = 0;
			});
		}
		anim.animate();
	}

	Y$ = function( id) {
		return extend( ( id.tagName && id ) || Y$$( "#".concat( id))[0] || null, YElement);
	}
	Y$$ = function( selector, root_node, first_only) {
		var root_node = root_node || null;
		var first_only = first_only || 0;
		var res = YS.query( selector, root_node, first_only);
		for( var i=0; i<res.length; i++) {
			extend( res[i], YElement);
		}
		return extend( res, YElement);
	}
	Y$A = function( collection) {
		return extend( collection, YElement);
	}
})();
/*YUI End*/

var Crc32Tab = new Array(
0x00000000,0x77073096,0xEE0E612C,0x990951BA,0x076DC419,0x706AF48F,0xE963A535,0x9E6495A3,
0x0EDB8832,0x79DCB8A4,0xE0D5E91E,0x97D2D988,0x09B64C2B,0x7EB17CBD,0xE7B82D07,0x90BF1D91,
0x1DB71064,0x6AB020F2,0xF3B97148,0x84BE41DE,0x1ADAD47D,0x6DDDE4EB,0xF4D4B551,0x83D385C7,
0x136C9856,0x646BA8C0,0xFD62F97A,0x8A65C9EC,0x14015C4F,0x63066CD9,0xFA0F3D63,0x8D080DF5,
0x3B6E20C8,0x4C69105E,0xD56041E4,0xA2677172,0x3C03E4D1,0x4B04D447,0xD20D85FD,0xA50AB56B,
0x35B5A8FA,0x42B2986C,0xDBBBC9D6,0xACBCF940,0x32D86CE3,0x45DF5C75,0xDCD60DCF,0xABD13D59,
0x26D930AC,0x51DE003A,0xC8D75180,0xBFD06116,0x21B4F4B5,0x56B3C423,0xCFBA9599,0xB8BDA50F,
0x2802B89E,0x5F058808,0xC60CD9B2,0xB10BE924,0x2F6F7C87,0x58684C11,0xC1611DAB,0xB6662D3D,
0x76DC4190,0x01DB7106,0x98D220BC,0xEFD5102A,0x71B18589,0x06B6B51F,0x9FBFE4A5,0xE8B8D433,
0x7807C9A2,0x0F00F934,0x9609A88E,0xE10E9818,0x7F6A0DBB,0x086D3D2D,0x91646C97,0xE6635C01,
0x6B6B51F4,0x1C6C6162,0x856530D8,0xF262004E,0x6C0695ED,0x1B01A57B,0x8208F4C1,0xF50FC457,
0x65B0D9C6,0x12B7E950,0x8BBEB8EA,0xFCB9887C,0x62DD1DDF,0x15DA2D49,0x8CD37CF3,0xFBD44C65,
0x4DB26158,0x3AB551CE,0xA3BC0074,0xD4BB30E2,0x4ADFA541,0x3DD895D7,0xA4D1C46D,0xD3D6F4FB,
0x4369E96A,0x346ED9FC,0xAD678846,0xDA60B8D0,0x44042D73,0x33031DE5,0xAA0A4C5F,0xDD0D7CC9,
0x5005713C,0x270241AA,0xBE0B1010,0xC90C2086,0x5768B525,0x206F85B3,0xB966D409,0xCE61E49F,
0x5EDEF90E,0x29D9C998,0xB0D09822,0xC7D7A8B4,0x59B33D17,0x2EB40D81,0xB7BD5C3B,0xC0BA6CAD,
0xEDB88320,0x9ABFB3B6,0x03B6E20C,0x74B1D29A,0xEAD54739,0x9DD277AF,0x04DB2615,0x73DC1683,
0xE3630B12,0x94643B84,0x0D6D6A3E,0x7A6A5AA8,0xE40ECF0B,0x9309FF9D,0x0A00AE27,0x7D079EB1,
0xF00F9344,0x8708A3D2,0x1E01F268,0x6906C2FE,0xF762575D,0x806567CB,0x196C3671,0x6E6B06E7,
0xFED41B76,0x89D32BE0,0x10DA7A5A,0x67DD4ACC,0xF9B9DF6F,0x8EBEEFF9,0x17B7BE43,0x60B08ED5,
0xD6D6A3E8,0xA1D1937E,0x38D8C2C4,0x4FDFF252,0xD1BB67F1,0xA6BC5767,0x3FB506DD,0x48B2364B,
0xD80D2BDA,0xAF0A1B4C,0x36034AF6,0x41047A60,0xDF60EFC3,0xA867DF55,0x316E8EEF,0x4669BE79,
0xCB61B38C,0xBC66831A,0x256FD2A0,0x5268E236,0xCC0C7795,0xBB0B4703,0x220216B9,0x5505262F,
0xC5BA3BBE,0xB2BD0B28,0x2BB45A92,0x5CB36A04,0xC2D7FFA7,0xB5D0CF31,0x2CD99E8B,0x5BDEAE1D,
0x9B64C2B0,0xEC63F226,0x756AA39C,0x026D930A,0x9C0906A9,0xEB0E363F,0x72076785,0x05005713,
0x95BF4A82,0xE2B87A14,0x7BB12BAE,0x0CB61B38,0x92D28E9B,0xE5D5BE0D,0x7CDCEFB7,0x0BDBDF21,
0x86D3D2D4,0xF1D4E242,0x68DDB3F8,0x1FDA836E,0x81BE16CD,0xF6B9265B,0x6FB077E1,0x18B74777,
0x88085AE6,0xFF0F6A70,0x66063BCA,0x11010B5C,0x8F659EFF,0xF862AE69,0x616BFFD3,0x166CCF45,
0xA00AE278,0xD70DD2EE,0x4E048354,0x3903B3C2,0xA7672661,0xD06016F7,0x4969474D,0x3E6E77DB,
0xAED16A4A,0xD9D65ADC,0x40DF0B66,0x37D83BF0,0xA9BCAE53,0xDEBB9EC5,0x47B2CF7F,0x30B5FFE9,
0xBDBDF21C,0xCABAC28A,0x53B39330,0x24B4A3A6,0xBAD03605,0xCDD70693,0x54DE5729,0x23D967BF,
0xB3667A2E,0xC4614AB8,0x5D681B02,0x2A6F2B94,0xB40BBE37,0xC30C8EA1,0x5A05DF1B,0x2D02EF8D);

function Crc32Add(crc,c)
{
  return Crc32Tab[(crc^c)&0xFF]^((crc>>8)&0xFFFFFF);
}

function Crc32Str(str)
{
  var n;
  var len=str.length;
  var crc;

  crc=0xFFFFFFFF;
  for (n=0; n<len; n++)
  {
	crc=Crc32Add(crc,str.charCodeAt(n));
  }
  return crc^0xFFFFFFFF;
}