/*!
 * Sizzle CSS Selector Engine
 *  Copyright 2011, The Dojo Foundation
 *  Released under the MIT, BSD, and GPL Licenses.
 *  More information: http://sizzlejs.com/
 */
(function(){

var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,
	done = 0,
	toString = Object.prototype.toString,
	hasDuplicate = false,
	baseHasDuplicate = true,
	rBackslash = /\\/g,
	rNonWord = /\W/;

// Here we check if the JavaScript engine is using some sort of
// optimization where it does not always call our comparision
// function. If that is the case, discard the hasDuplicate value.
//   Thus far that includes Google Chrome.
[0, 0].sort(function() {
	baseHasDuplicate = false;
	return 0;
});

var Sizzle = function( selector, context, results, seed ) {
	results = results || [];
	context = context || document;

	var origContext = context;

	if ( context.nodeType !== 1 && context.nodeType !== 9 ) {
		return [];
	}
	
	if ( !selector || typeof selector !== "string" ) {
		return results;
	}

	var m, set, checkSet, extra, ret, cur, pop, i,
		prune = true,
		contextXML = Sizzle.isXML( context ),
		parts = [],
		soFar = selector;
	
	// Reset the position of the chunker regexp (start from head)
	do {
		chunker.exec( "" );
		m = chunker.exec( soFar );

		if ( m ) {
			soFar = m[3];
		
			parts.push( m[1] );
		
			if ( m[2] ) {
				extra = m[3];
				break;
			}
		}
	} while ( m );

	if ( parts.length > 1 && origPOS.exec( selector ) ) {

		if ( parts.length === 2 && Expr.relative[ parts[0] ] ) {
			set = posProcess( parts[0] + parts[1], context );

		} else {
			set = Expr.relative[ parts[0] ] ?
				[ context ] :
				Sizzle( parts.shift(), context );

			while ( parts.length ) {
				selector = parts.shift();

				if ( Expr.relative[ selector ] ) {
					selector += parts.shift();
				}
				
				set = posProcess( selector, set );
			}
		}

	} else {
		// Take a shortcut and set the context if the root selector is an ID
		// (but not if it'll be faster if the inner selector is an ID)
		if ( !seed && parts.length > 1 && context.nodeType === 9 && !contextXML &&
				Expr.match.ID.test(parts[0]) && !Expr.match.ID.test(parts[parts.length - 1]) ) {

			ret = Sizzle.find( parts.shift(), context, contextXML );
			context = ret.expr ?
				Sizzle.filter( ret.expr, ret.set )[0] :
				ret.set[0];
		}

		if ( context ) {
			ret = seed ?
				{ expr: parts.pop(), set: makeArray(seed) } :
				Sizzle.find( parts.pop(), parts.length === 1 && (parts[0] === "~" || parts[0] === "+") && context.parentNode ? context.parentNode : context, contextXML );

			set = ret.expr ?
				Sizzle.filter( ret.expr, ret.set ) :
				ret.set;

			if ( parts.length > 0 ) {
				checkSet = makeArray( set );

			} else {
				prune = false;
			}

			while ( parts.length ) {
				cur = parts.pop();
				pop = cur;

				if ( !Expr.relative[ cur ] ) {
					cur = "";
				} else {
					pop = parts.pop();
				}

				if ( pop == null ) {
					pop = context;
				}

				Expr.relative[ cur ]( checkSet, pop, contextXML );
			}

		} else {
			checkSet = parts = [];
		}
	}

	if ( !checkSet ) {
		checkSet = set;
	}

	if ( !checkSet ) {
		Sizzle.error( cur || selector );
	}

	if ( toString.call(checkSet) === "[object Array]" ) {
		if ( !prune ) {
			results.push.apply( results, checkSet );

		} else if ( context && context.nodeType === 1 ) {
			for ( i = 0; checkSet[i] != null; i++ ) {
				if ( checkSet[i] && (checkSet[i] === true || checkSet[i].nodeType === 1 && Sizzle.contains(context, checkSet[i])) ) {
					results.push( set[i] );
				}
			}

		} else {
			for ( i = 0; checkSet[i] != null; i++ ) {
				if ( checkSet[i] && checkSet[i].nodeType === 1 ) {
					results.push( set[i] );
				}
			}
		}

	} else {
		makeArray( checkSet, results );
	}

	if ( extra ) {
		Sizzle( extra, origContext, results, seed );
		Sizzle.uniqueSort( results );
	}

	return results;
};

Sizzle.uniqueSort = function( results ) {
	if ( sortOrder ) {
		hasDuplicate = baseHasDuplicate;
		results.sort( sortOrder );

		if ( hasDuplicate ) {
			for ( var i = 1; i < results.length; i++ ) {
				if ( results[i] === results[ i - 1 ] ) {
					results.splice( i--, 1 );
				}
			}
		}
	}

	return results;
};

Sizzle.matches = function( expr, set ) {
	return Sizzle( expr, null, null, set );
};

Sizzle.matchesSelector = function( node, expr ) {
	return Sizzle( expr, null, null, [node] ).length > 0;
};

Sizzle.find = function( expr, context, isXML ) {
	var set;

	if ( !expr ) {
		return [];
	}

	for ( var i = 0, l = Expr.order.length; i < l; i++ ) {
		var match,
			type = Expr.order[i];
		
		if ( (match = Expr.leftMatch[ type ].exec( expr )) ) {
			var left = match[1];
			match.splice( 1, 1 );

			if ( left.substr( left.length - 1 ) !== "\\" ) {
				match[1] = (match[1] || "").replace( rBackslash, "" );
				set = Expr.find[ type ]( match, context, isXML );

				if ( set != null ) {
					expr = expr.replace( Expr.match[ type ], "" );
					break;
				}
			}
		}
	}

	if ( !set ) {
		set = typeof context.getElementsByTagName !== "undefined" ?
			context.getElementsByTagName( "*" ) :
			[];
	}

	return { set: set, expr: expr };
};

Sizzle.filter = function( expr, set, inplace, not ) {
	var match, anyFound,
		old = expr,
		result = [],
		curLoop = set,
		isXMLFilter = set && set[0] && Sizzle.isXML( set[0] );

	while ( expr && set.length ) {
		for ( var type in Expr.filter ) {
			if ( (match = Expr.leftMatch[ type ].exec( expr )) != null && match[2] ) {
				var found, item,
					filter = Expr.filter[ type ],
					left = match[1];

				anyFound = false;

				match.splice(1,1);

				if ( left.substr( left.length - 1 ) === "\\" ) {
					continue;
				}

				if ( curLoop === result ) {
					result = [];
				}

				if ( Expr.preFilter[ type ] ) {
					match = Expr.preFilter[ type ]( match, curLoop, inplace, result, not, isXMLFilter );

					if ( !match ) {
						anyFound = found = true;

					} else if ( match === true ) {
						continue;
					}
				}

				if ( match ) {
					for ( var i = 0; (item = curLoop[i]) != null; i++ ) {
						if ( item ) {
							found = filter( item, match, i, curLoop );
							var pass = not ^ !!found;

							if ( inplace && found != null ) {
								if ( pass ) {
									anyFound = true;

								} else {
									curLoop[i] = false;
								}

							} else if ( pass ) {
								result.push( item );
								anyFound = true;
							}
						}
					}
				}

				if ( found !== undefined ) {
					if ( !inplace ) {
						curLoop = result;
					}

					expr = expr.replace( Expr.match[ type ], "" );

					if ( !anyFound ) {
						return [];
					}

					break;
				}
			}
		}

		// Improper expression
		if ( expr === old ) {
			if ( anyFound == null ) {
				Sizzle.error( expr );

			} else {
				break;
			}
		}

		old = expr;
	}

	return curLoop;
};

Sizzle.error = function( msg ) {
	throw "Syntax error, unrecognized expression: " + msg;
};

var Expr = Sizzle.selectors = {
	order: [ "ID", "NAME", "TAG" ],

	match: {
		ID: /#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,
		CLASS: /\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,
		NAME: /\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/,
		ATTR: /\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(?:(['"])(.*?)\3|(#?(?:[\w\u00c0-\uFFFF\-]|\\.)*)|)|)\s*\]/,
		TAG: /^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/,
		CHILD: /:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+\-]?\d+|(?:[+\-]?\d*)?n\s*(?:[+\-]\s*\d+)?))\s*\))?/,
		POS: /:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/,
		PSEUDO: /:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/
	},

	leftMatch: {},

	attrMap: {
		"class": "className",
		"for": "htmlFor"
	},

	attrHandle: {
		href: function( elem ) {
			return elem.getAttribute( "href" );
		},
		type: function( elem ) {
			return elem.getAttribute( "type" );
		}
	},

	relative: {
		"+": function(checkSet, part){
			var isPartStr = typeof part === "string",
				isTag = isPartStr && !rNonWord.test( part ),
				isPartStrNotTag = isPartStr && !isTag;

			if ( isTag ) {
				part = part.toLowerCase();
			}

			for ( var i = 0, l = checkSet.length, elem; i < l; i++ ) {
				if ( (elem = checkSet[i]) ) {
					while ( (elem = elem.previousSibling) && elem.nodeType !== 1 ) {}

					checkSet[i] = isPartStrNotTag || elem && elem.nodeName.toLowerCase() === part ?
						elem || false :
						elem === part;
				}
			}

			if ( isPartStrNotTag ) {
				Sizzle.filter( part, checkSet, true );
			}
		},

		">": function( checkSet, part ) {
			var elem,
				isPartStr = typeof part === "string",
				i = 0,
				l = checkSet.length;

			if ( isPartStr && !rNonWord.test( part ) ) {
				part = part.toLowerCase();

				for ( ; i < l; i++ ) {
					elem = checkSet[i];

					if ( elem ) {
						var parent = elem.parentNode;
						checkSet[i] = parent.nodeName.toLowerCase() === part ? parent : false;
					}
				}

			} else {
				for ( ; i < l; i++ ) {
					elem = checkSet[i];

					if ( elem ) {
						checkSet[i] = isPartStr ?
							elem.parentNode :
							elem.parentNode === part;
					}
				}

				if ( isPartStr ) {
					Sizzle.filter( part, checkSet, true );
				}
			}
		},

		"": function(checkSet, part, isXML){
			var nodeCheck,
				doneName = done++,
				checkFn = dirCheck;

			if ( typeof part === "string" && !rNonWord.test( part ) ) {
				part = part.toLowerCase();
				nodeCheck = part;
				checkFn = dirNodeCheck;
			}

			checkFn( "parentNode", part, doneName, checkSet, nodeCheck, isXML );
		},

		"~": function( checkSet, part, isXML ) {
			var nodeCheck,
				doneName = done++,
				checkFn = dirCheck;

			if ( typeof part === "string" && !rNonWord.test( part ) ) {
				part = part.toLowerCase();
				nodeCheck = part;
				checkFn = dirNodeCheck;
			}

			checkFn( "previousSibling", part, doneName, checkSet, nodeCheck, isXML );
		}
	},

	find: {
		ID: function( match, context, isXML ) {
			if ( typeof context.getElementById !== "undefined" && !isXML ) {
				var m = context.getElementById(match[1]);
				// Check parentNode to catch when Blackberry 4.6 returns
				// nodes that are no longer in the document #6963
				return m && m.parentNode ? [m] : [];
			}
		},

		NAME: function( match, context ) {
			if ( typeof context.getElementsByName !== "undefined" ) {
				var ret = [],
					results = context.getElementsByName( match[1] );

				for ( var i = 0, l = results.length; i < l; i++ ) {
					if ( results[i].getAttribute("name") === match[1] ) {
						ret.push( results[i] );
					}
				}

				return ret.length === 0 ? null : ret;
			}
		},

		TAG: function( match, context ) {
			if ( typeof context.getElementsByTagName !== "undefined" ) {
				return context.getElementsByTagName( match[1] );
			}
		}
	},
	preFilter: {
		CLASS: function( match, curLoop, inplace, result, not, isXML ) {
			match = " " + match[1].replace( rBackslash, "" ) + " ";

			if ( isXML ) {
				return match;
			}

			for ( var i = 0, elem; (elem = curLoop[i]) != null; i++ ) {
				if ( elem ) {
					if ( not ^ (elem.className && (" " + elem.className + " ").replace(/[\t\n\r]/g, " ").indexOf(match) >= 0) ) {
						if ( !inplace ) {
							result.push( elem );
						}

					} else if ( inplace ) {
						curLoop[i] = false;
					}
				}
			}

			return false;
		},

		ID: function( match ) {
			return match[1].replace( rBackslash, "" );
		},

		TAG: function( match, curLoop ) {
			return match[1].replace( rBackslash, "" ).toLowerCase();
		},

		CHILD: function( match ) {
			if ( match[1] === "nth" ) {
				if ( !match[2] ) {
					Sizzle.error( match[0] );
				}

				match[2] = match[2].replace(/^\+|\s*/g, '');

				// parse equations like 'even', 'odd', '5', '2n', '3n+2', '4n-1', '-n+6'
				var test = /(-?)(\d*)(?:n([+\-]?\d*))?/.exec(
					match[2] === "even" && "2n" || match[2] === "odd" && "2n+1" ||
					!/\D/.test( match[2] ) && "0n+" + match[2] || match[2]);

				// calculate the numbers (first)n+(last) including if they are negative
				match[2] = (test[1] + (test[2] || 1)) - 0;
				match[3] = test[3] - 0;
			}
			else if ( match[2] ) {
				Sizzle.error( match[0] );
			}

			// TODO: Move to normal caching system
			match[0] = done++;

			return match;
		},

		ATTR: function( match, curLoop, inplace, result, not, isXML ) {
			var name = match[1] = match[1].replace( rBackslash, "" );
			
			if ( !isXML && Expr.attrMap[name] ) {
				match[1] = Expr.attrMap[name];
			}

			// Handle if an un-quoted value was used
			match[4] = ( match[4] || match[5] || "" ).replace( rBackslash, "" );

			if ( match[2] === "~=" ) {
				match[4] = " " + match[4] + " ";
			}

			return match;
		},

		PSEUDO: function( match, curLoop, inplace, result, not ) {
			if ( match[1] === "not" ) {
				// If we're dealing with a complex expression, or a simple one
				if ( ( chunker.exec(match[3]) || "" ).length > 1 || /^\w/.test(match[3]) ) {
					match[3] = Sizzle(match[3], null, null, curLoop);

				} else {
					var ret = Sizzle.filter(match[3], curLoop, inplace, true ^ not);

					if ( !inplace ) {
						result.push.apply( result, ret );
					}

					return false;
				}

			} else if ( Expr.match.POS.test( match[0] ) || Expr.match.CHILD.test( match[0] ) ) {
				return true;
			}
			
			return match;
		},

		POS: function( match ) {
			match.unshift( true );

			return match;
		}
	},
	
	filters: {
		enabled: function( elem ) {
			return elem.disabled === false && elem.type !== "hidden";
		},

		disabled: function( elem ) {
			return elem.disabled === true;
		},

		checked: function( elem ) {
			return elem.checked === true;
		},
		
		selected: function( elem ) {
			// Accessing this property makes selected-by-default
			// options in Safari work properly
			if ( elem.parentNode ) {
				elem.parentNode.selectedIndex;
			}
			
			return elem.selected === true;
		},

		parent: function( elem ) {
			return !!elem.firstChild;
		},

		empty: function( elem ) {
			return !elem.firstChild;
		},

		has: function( elem, i, match ) {
			return !!Sizzle( match[3], elem ).length;
		},

		header: function( elem ) {
			return (/h\d/i).test( elem.nodeName );
		},

		text: function( elem ) {
			var attr = elem.getAttribute( "type" ), type = elem.type;
			// IE6 and 7 will map elem.type to 'text' for new HTML5 types (search, etc) 
			// use getAttribute instead to test this case
			return elem.nodeName.toLowerCase() === "input" && "text" === type && ( attr === type || attr === null );
		},

		radio: function( elem ) {
			return elem.nodeName.toLowerCase() === "input" && "radio" === elem.type;
		},

		checkbox: function( elem ) {
			return elem.nodeName.toLowerCase() === "input" && "checkbox" === elem.type;
		},

		file: function( elem ) {
			return elem.nodeName.toLowerCase() === "input" && "file" === elem.type;
		},

		password: function( elem ) {
			return elem.nodeName.toLowerCase() === "input" && "password" === elem.type;
		},

		submit: function( elem ) {
			var name = elem.nodeName.toLowerCase();
			return (name === "input" || name === "button") && "submit" === elem.type;
		},

		image: function( elem ) {
			return elem.nodeName.toLowerCase() === "input" && "image" === elem.type;
		},

		reset: function( elem ) {
			var name = elem.nodeName.toLowerCase();
			return (name === "input" || name === "button") && "reset" === elem.type;
		},

		button: function( elem ) {
			var name = elem.nodeName.toLowerCase();
			return name === "input" && "button" === elem.type || name === "button";
		},

		input: function( elem ) {
			return (/input|select|textarea|button/i).test( elem.nodeName );
		},

		focus: function( elem ) {
			return elem === elem.ownerDocument.activeElement;
		}
	},
	setFilters: {
		first: function( elem, i ) {
			return i === 0;
		},

		last: function( elem, i, match, array ) {
			return i === array.length - 1;
		},

		even: function( elem, i ) {
			return i % 2 === 0;
		},

		odd: function( elem, i ) {
			return i % 2 === 1;
		},

		lt: function( elem, i, match ) {
			return i < match[3] - 0;
		},

		gt: function( elem, i, match ) {
			return i > match[3] - 0;
		},

		nth: function( elem, i, match ) {
			return match[3] - 0 === i;
		},

		eq: function( elem, i, match ) {
			return match[3] - 0 === i;
		}
	},
	filter: {
		PSEUDO: function( elem, match, i, array ) {
			var name = match[1],
				filter = Expr.filters[ name ];

			if ( filter ) {
				return filter( elem, i, match, array );

			} else if ( name === "contains" ) {
				return (elem.textContent || elem.innerText || Sizzle.getText([ elem ]) || "").indexOf(match[3]) >= 0;

			} else if ( name === "not" ) {
				var not = match[3];

				for ( var j = 0, l = not.length; j < l; j++ ) {
					if ( not[j] === elem ) {
						return false;
					}
				}

				return true;

			} else {
				Sizzle.error( name );
			}
		},

		CHILD: function( elem, match ) {
			var type = match[1],
				node = elem;

			switch ( type ) {
				case "only":
				case "first":
					while ( (node = node.previousSibling) )	 {
						if ( node.nodeType === 1 ) { 
							return false; 
						}
					}

					if ( type === "first" ) { 
						return true; 
					}

					node = elem;

				case "last":
					while ( (node = node.nextSibling) )	 {
						if ( node.nodeType === 1 ) { 
							return false; 
						}
					}

					return true;

				case "nth":
					var first = match[2],
						last = match[3];

					if ( first === 1 && last === 0 ) {
						return true;
					}
					
					var doneName = match[0],
						parent = elem.parentNode;
	
					if ( parent && (parent.sizcache !== doneName || !elem.nodeIndex) ) {
						var count = 0;
						
						for ( node = parent.firstChild; node; node = node.nextSibling ) {
							if ( node.nodeType === 1 ) {
								node.nodeIndex = ++count;
							}
						} 

						parent.sizcache = doneName;
					}
					
					var diff = elem.nodeIndex - last;

					if ( first === 0 ) {
						return diff === 0;

					} else {
						return ( diff % first === 0 && diff / first >= 0 );
					}
			}
		},

		ID: function( elem, match ) {
			return elem.nodeType === 1 && elem.getAttribute("id") === match;
		},

		TAG: function( elem, match ) {
			return (match === "*" && elem.nodeType === 1) || elem.nodeName.toLowerCase() === match;
		},
		
		CLASS: function( elem, match ) {
			return (" " + (elem.className || elem.getAttribute("class")) + " ")
				.indexOf( match ) > -1;
		},

		ATTR: function( elem, match ) {
			var name = match[1],
				result = Expr.attrHandle[ name ] ?
					Expr.attrHandle[ name ]( elem ) :
					elem[ name ] != null ?
						elem[ name ] :
						elem.getAttribute( name ),
				value = result + "",
				type = match[2],
				check = match[4];

			return result == null ?
				type === "!=" :
				type === "=" ?
				value === check :
				type === "*=" ?
				value.indexOf(check) >= 0 :
				type === "~=" ?
				(" " + value + " ").indexOf(check) >= 0 :
				!check ?
				value && result !== false :
				type === "!=" ?
				value !== check :
				type === "^=" ?
				value.indexOf(check) === 0 :
				type === "$=" ?
				value.substr(value.length - check.length) === check :
				type === "|=" ?
				value === check || value.substr(0, check.length + 1) === check + "-" :
				false;
		},

		POS: function( elem, match, i, array ) {
			var name = match[2],
				filter = Expr.setFilters[ name ];

			if ( filter ) {
				return filter( elem, i, match, array );
			}
		}
	}
};

var origPOS = Expr.match.POS,
	fescape = function(all, num){
		return "\\" + (num - 0 + 1);
	};

for ( var type in Expr.match ) {
	Expr.match[ type ] = new RegExp( Expr.match[ type ].source + (/(?![^\[]*\])(?![^\(]*\))/.source) );
	Expr.leftMatch[ type ] = new RegExp( /(^(?:.|\r|\n)*?)/.source + Expr.match[ type ].source.replace(/\\(\d+)/g, fescape) );
}

var makeArray = function( array, results ) {
	array = Array.prototype.slice.call( array, 0 );

	if ( results ) {
		results.push.apply( results, array );
		return results;
	}
	
	return array;
};

// Perform a simple check to determine if the browser is capable of
// converting a NodeList to an array using builtin methods.
// Also verifies that the returned array holds DOM nodes
// (which is not the case in the Blackberry browser)
try {
	Array.prototype.slice.call( document.documentElement.childNodes, 0 )[0].nodeType;

// Provide a fallback method if it does not work
} catch( e ) {
	makeArray = function( array, results ) {
		var i = 0,
			ret = results || [];

		if ( toString.call(array) === "[object Array]" ) {
			Array.prototype.push.apply( ret, array );

		} else {
			if ( typeof array.length === "number" ) {
				for ( var l = array.length; i < l; i++ ) {
					ret.push( array[i] );
				}

			} else {
				for ( ; array[i]; i++ ) {
					ret.push( array[i] );
				}
			}
		}

		return ret;
	};
}

var sortOrder, siblingCheck;

if ( document.documentElement.compareDocumentPosition ) {
	sortOrder = function( a, b ) {
		if ( a === b ) {
			hasDuplicate = true;
			return 0;
		}

		if ( !a.compareDocumentPosition || !b.compareDocumentPosition ) {
			return a.compareDocumentPosition ? -1 : 1;
		}

		return a.compareDocumentPosition(b) & 4 ? -1 : 1;
	};

} else {
	sortOrder = function( a, b ) {
		// The nodes are identical, we can exit early
		if ( a === b ) {
			hasDuplicate = true;
			return 0;

		// Fallback to using sourceIndex (in IE) if it's available on both nodes
		} else if ( a.sourceIndex && b.sourceIndex ) {
			return a.sourceIndex - b.sourceIndex;
		}

		var al, bl,
			ap = [],
			bp = [],
			aup = a.parentNode,
			bup = b.parentNode,
			cur = aup;

		// If the nodes are siblings (or identical) we can do a quick check
		if ( aup === bup ) {
			return siblingCheck( a, b );

		// If no parents were found then the nodes are disconnected
		} else if ( !aup ) {
			return -1;

		} else if ( !bup ) {
			return 1;
		}

		// Otherwise they're somewhere else in the tree so we need
		// to build up a full list of the parentNodes for comparison
		while ( cur ) {
			ap.unshift( cur );
			cur = cur.parentNode;
		}

		cur = bup;

		while ( cur ) {
			bp.unshift( cur );
			cur = cur.parentNode;
		}

		al = ap.length;
		bl = bp.length;

		// Start walking down the tree looking for a discrepancy
		for ( var i = 0; i < al && i < bl; i++ ) {
			if ( ap[i] !== bp[i] ) {
				return siblingCheck( ap[i], bp[i] );
			}
		}

		// We ended someplace up the tree so do a sibling check
		return i === al ?
			siblingCheck( a, bp[i], -1 ) :
			siblingCheck( ap[i], b, 1 );
	};

	siblingCheck = function( a, b, ret ) {
		if ( a === b ) {
			return ret;
		}

		var cur = a.nextSibling;

		while ( cur ) {
			if ( cur === b ) {
				return -1;
			}

			cur = cur.nextSibling;
		}

		return 1;
	};
}

// Utility function for retreiving the text value of an array of DOM nodes
Sizzle.getText = function( elems ) {
	var ret = "", elem;

	for ( var i = 0; elems[i]; i++ ) {
		elem = elems[i];

		// Get the text from text nodes and CDATA nodes
		if ( elem.nodeType === 3 || elem.nodeType === 4 ) {
			ret += elem.nodeValue;

		// Traverse everything else, except comment nodes
		} else if ( elem.nodeType !== 8 ) {
			ret += Sizzle.getText( elem.childNodes );
		}
	}

	return ret;
};

// Check to see if the browser returns elements by name when
// querying by getElementById (and provide a workaround)
(function(){
	// We're going to inject a fake input element with a specified name
	var form = document.createElement("div"),
		id = "script" + (new Date()).getTime(),
		root = document.documentElement;

	form.innerHTML = "<a name='" + id + "'/>";

	// Inject it into the root element, check its status, and remove it quickly
	root.insertBefore( form, root.firstChild );

	// The workaround has to do additional checks after a getElementById
	// Which slows things down for other browsers (hence the branching)
	if ( document.getElementById( id ) ) {
		Expr.find.ID = function( match, context, isXML ) {
			if ( typeof context.getElementById !== "undefined" && !isXML ) {
				var m = context.getElementById(match[1]);

				return m ?
					m.id === match[1] || typeof m.getAttributeNode !== "undefined" && m.getAttributeNode("id").nodeValue === match[1] ?
						[m] :
						undefined :
					[];
			}
		};

		Expr.filter.ID = function( elem, match ) {
			var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id");

			return elem.nodeType === 1 && node && node.nodeValue === match;
		};
	}

	root.removeChild( form );

	// release memory in IE
	root = form = null;
})();

(function(){
	// Check to see if the browser returns only elements
	// when doing getElementsByTagName("*")

	// Create a fake element
	var div = document.createElement("div");
	div.appendChild( document.createComment("") );

	// Make sure no comments are found
	if ( div.getElementsByTagName("*").length > 0 ) {
		Expr.find.TAG = function( match, context ) {
			var results = context.getElementsByTagName( match[1] );

			// Filter out possible comments
			if ( match[1] === "*" ) {
				var tmp = [];

				for ( var i = 0; results[i]; i++ ) {
					if ( results[i].nodeType === 1 ) {
						tmp.push( results[i] );
					}
				}

				results = tmp;
			}

			return results;
		};
	}

	// Check to see if an attribute returns normalized href attributes
	div.innerHTML = "<a href='#'></a>";

	if ( div.firstChild && typeof div.firstChild.getAttribute !== "undefined" &&
			div.firstChild.getAttribute("href") !== "#" ) {

		Expr.attrHandle.href = function( elem ) {
			return elem.getAttribute( "href", 2 );
		};
	}

	// release memory in IE
	div = null;
})();

if ( document.querySelectorAll ) {
	(function(){
		var oldSizzle = Sizzle,
			div = document.createElement("div"),
			id = "__sizzle__";

		div.innerHTML = "<p class='TEST'></p>";

		// Safari can't handle uppercase or unicode characters when
		// in quirks mode.
		if ( div.querySelectorAll && div.querySelectorAll(".TEST").length === 0 ) {
			return;
		}
	
		Sizzle = function( query, context, extra, seed ) {
			context = context || document;

			// Only use querySelectorAll on non-XML documents
			// (ID selectors don't work in non-HTML documents)
			if ( !seed && !Sizzle.isXML(context) ) {
				// See if we find a selector to speed up
				var match = /^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec( query );
				
				if ( match && (context.nodeType === 1 || context.nodeType === 9) ) {
					// Speed-up: Sizzle("TAG")
					if ( match[1] ) {
						return makeArray( context.getElementsByTagName( query ), extra );
					
					// Speed-up: Sizzle(".CLASS")
					} else if ( match[2] && Expr.find.CLASS && context.getElementsByClassName ) {
						return makeArray( context.getElementsByClassName( match[2] ), extra );
					}
				}
				
				if ( context.nodeType === 9 ) {
					// Speed-up: Sizzle("body")
					// The body element only exists once, optimize finding it
					if ( query === "body" && context.body ) {
						return makeArray( [ context.body ], extra );
						
					// Speed-up: Sizzle("#ID")
					} else if ( match && match[3] ) {
						var elem = context.getElementById( match[3] );

						// Check parentNode to catch when Blackberry 4.6 returns
						// nodes that are no longer in the document #6963
						if ( elem && elem.parentNode ) {
							// Handle the case where IE and Opera return items
							// by name instead of ID
							if ( elem.id === match[3] ) {
								return makeArray( [ elem ], extra );
							}
							
						} else {
							return makeArray( [], extra );
						}
					}
					
					try {
						return makeArray( context.querySelectorAll(query), extra );
					} catch(qsaError) {}

				// qSA works strangely on Element-rooted queries
				// We can work around this by specifying an extra ID on the root
				// and working up from there (Thanks to Andrew Dupont for the technique)
				// IE 8 doesn't work on object elements
				} else if ( context.nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) {
					var oldContext = context,
						old = context.getAttribute( "id" ),
						nid = old || id,
						hasParent = context.parentNode,
						relativeHierarchySelector = /^\s*[+~]/.test( query );

					if ( !old ) {
						context.setAttribute( "id", nid );
					} else {
						nid = nid.replace( /'/g, "\\$&" );
					}
					if ( relativeHierarchySelector && hasParent ) {
						context = context.parentNode;
					}

					try {
						if ( !relativeHierarchySelector || hasParent ) {
							return makeArray( context.querySelectorAll( "[id='" + nid + "'] " + query ), extra );
						}

					} catch(pseudoError) {
					} finally {
						if ( !old ) {
							oldContext.removeAttribute( "id" );
						}
					}
				}
			}
		
			return oldSizzle(query, context, extra, seed);
		};

		for ( var prop in oldSizzle ) {
			Sizzle[ prop ] = oldSizzle[ prop ];
		}

		// release memory in IE
		div = null;
	})();
}

(function(){
	var html = document.documentElement,
		matches = html.matchesSelector || html.mozMatchesSelector || html.webkitMatchesSelector || html.msMatchesSelector;

	if ( matches ) {
		// Check to see if it's possible to do matchesSelector
		// on a disconnected node (IE 9 fails this)
		var disconnectedMatch = !matches.call( document.createElement( "div" ), "div" ),
			pseudoWorks = false;

		try {
			// This should fail with an exception
			// Gecko does not error, returns false instead
			matches.call( document.documentElement, "[test!='']:sizzle" );
	
		} catch( pseudoError ) {
			pseudoWorks = true;
		}

		Sizzle.matchesSelector = function( node, expr ) {
			// Make sure that attribute selectors are quoted
			expr = expr.replace(/\=\s*([^'"\]]*)\s*\]/g, "='$1']");

			if ( !Sizzle.isXML( node ) ) {
				try { 
					if ( pseudoWorks || !Expr.match.PSEUDO.test( expr ) && !/!=/.test( expr ) ) {
						var ret = matches.call( node, expr );

						// IE 9's matchesSelector returns false on disconnected nodes
						if ( ret || !disconnectedMatch ||
								// As well, disconnected nodes are said to be in a document
								// fragment in IE 9, so check for that
								node.document && node.document.nodeType !== 11 ) {
							return ret;
						}
					}
				} catch(e) {}
			}

			return Sizzle(expr, null, null, [node]).length > 0;
		};
	}
})();

(function(){
	var div = document.createElement("div");

	div.innerHTML = "<div class='test e'></div><div class='test'></div>";

	// Opera can't find a second classname (in 9.6)
	// Also, make sure that getElementsByClassName actually exists
	if ( !div.getElementsByClassName || div.getElementsByClassName("e").length === 0 ) {
		return;
	}

	// Safari caches class attributes, doesn't catch changes (in 3.2)
	div.lastChild.className = "e";

	if ( div.getElementsByClassName("e").length === 1 ) {
		return;
	}
	
	Expr.order.splice(1, 0, "CLASS");
	Expr.find.CLASS = function( match, context, isXML ) {
		if ( typeof context.getElementsByClassName !== "undefined" && !isXML ) {
			return context.getElementsByClassName(match[1]);
		}
	};

	// release memory in IE
	div = null;
})();

function dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
	for ( var i = 0, l = checkSet.length; i < l; i++ ) {
		var elem = checkSet[i];

		if ( elem ) {
			var match = false;

			elem = elem[dir];

			while ( elem ) {
				if ( elem.sizcache === doneName ) {
					match = checkSet[elem.sizset];
					break;
				}

				if ( elem.nodeType === 1 && !isXML ){
					elem.sizcache = doneName;
					elem.sizset = i;
				}

				if ( elem.nodeName.toLowerCase() === cur ) {
					match = elem;
					break;
				}

				elem = elem[dir];
			}

			checkSet[i] = match;
		}
	}
}

function dirCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
	for ( var i = 0, l = checkSet.length; i < l; i++ ) {
		var elem = checkSet[i];

		if ( elem ) {
			var match = false;
			
			elem = elem[dir];

			while ( elem ) {
				if ( elem.sizcache === doneName ) {
					match = checkSet[elem.sizset];
					break;
				}

				if ( elem.nodeType === 1 ) {
					if ( !isXML ) {
						elem.sizcache = doneName;
						elem.sizset = i;
					}

					if ( typeof cur !== "string" ) {
						if ( elem === cur ) {
							match = true;
							break;
						}

					} else if ( Sizzle.filter( cur, [elem] ).length > 0 ) {
						match = elem;
						break;
					}
				}

				elem = elem[dir];
			}

			checkSet[i] = match;
		}
	}
}

if ( document.documentElement.contains ) {
	Sizzle.contains = function( a, b ) {
		return a !== b && (a.contains ? a.contains(b) : true);
	};

} else if ( document.documentElement.compareDocumentPosition ) {
	Sizzle.contains = function( a, b ) {
		return !!(a.compareDocumentPosition(b) & 16);
	};

} else {
	Sizzle.contains = function() {
		return false;
	};
}

Sizzle.isXML = function( elem ) {
	// documentElement is verified for cases where it doesn't yet exist
	// (such as loading iframes in IE - #4833) 
	var documentElement = (elem ? elem.ownerDocument || elem : 0).documentElement;

	return documentElement ? documentElement.nodeName !== "HTML" : false;
};

var posProcess = function( selector, context ) {
	var match,
		tmpSet = [],
		later = "",
		root = context.nodeType ? [context] : context;

	// Position selectors must be done after the filter
	// And so must :not(positional) so we move all PSEUDOs to the end
	while ( (match = Expr.match.PSEUDO.exec( selector )) ) {
		later += match[0];
		selector = selector.replace( Expr.match.PSEUDO, "" );
	}

	selector = Expr.relative[selector] ? selector + "*" : selector;

	for ( var i = 0, l = root.length; i < l; i++ ) {
		Sizzle( selector, root[i], tmpSet );
	}

	return Sizzle.filter( later, tmpSet );
};

// EXPOSE

window.Sizzle = Sizzle;

})();


/**

 * Sony Computer Entertainment Inc.

 * 

 * @author    ShunsukeHirota TYO/THEORIA COMMUNICATIONS Division.

 * @version   1.3.1

 * 

 * Licensed under the MIT License

 * http://www.opensource.org/licenses/mit-license.php

 */



var SCE_APP = SCE_APP || {};

var __global = {};



/**

* @class Config

*/

SCE_APP.Config = (function() {

	var exports = {},

		/**

		* ※※※ Billboard自動再生時間（秒）

		*/

		AUTOPLAY_TIME = __global.AUTOPLAY_TIME || 10,

		

		/**

		* デバッグモードの真偽

		*/

		DEBUG = false

		

		/**

		* Rootパス

		*/

		, ROOT = DEBUG ? '/sce2' : '';

	

	/* ------------------------------------------------------------

	* Exports

	* ------------------------------------------------------------*/

	exports.DATA_PATH = DEBUG ? ROOT + '/common/data/' : ROOT + '';

	exports.DEBUG = DEBUG;

	exports.ROOT = ROOT;

	exports.AUTOPLAY_TIME = AUTOPLAY_TIME;

	return exports;

}());



SCE_APP.namespace = function (ns_string) {

	var parts = ns_string.split('.'),

		parent = SCE_APP,

		i;

		

	if (parts[0] === 'SCE_APP') {

		parts = parts.slice(1);

	}

	

	for (i = 0; i < parts.length; i += 1) {

		if (typeof parent[parts[i]] === 'undefined') {

			parent[parts[i]] = {};

		}

		parent = parent[parts[i]];

	}

	return parent;

};



/**

* ユーティリティ

* @namespace SCE_APP

* @class Utility

*/

SCE_APP.Utility = (function() {

	var DEBUG = SCE_APP.Config.DEBUG,

		FRAME_RATE = 16,

		_PS3 = 'ps3', _VITA = 'psv', _PSP = 'psp', _TOP = 'top',

		_SOFT = 'software', _SCE = 'sce',

		MASTER = [{

			name: 'playstation3',

			key: _PS3

		}, {

			name: 'playstation-vita',

			key: _VITA

		}, {

			name: 'playstation-portable',

			key: _PSP

		}, {

			name: 'index',

			key: _TOP

		}, {

			name: 'software',

			key: _SOFT

		}, {

			name: 'scesoftware',

			key: _SCE

		}]

		, ROOT = SCE_APP.Config.ROOT

		, intervals = []

		, _userAgent = (function() {

			var ua = navigator.userAgent.toLowerCase();

				

			return {

				firefox: ua.match('firefox') ? true : false,

				ie: (function(){

					var undef, v = 3, div = document.createElement('div');

					while (

						div.innerHTML = '<!--[if gt IE '+(++v)+']><i></i><![endif]-->',

						div.getElementsByTagName('i')[0]

					) {

						

					}

					return v> 4 ? v : undef;

				})(),

				chrome: ua.match('Chrome') ? true : false,

				safari: (ua.match('AppleWebkit') && !ua.match('Chrome')) ? true : false,

				ps3: ua.match('playstation 3') ? true : false,

				vita: ua.match('playstation vita') ? true : false,

				opera: ua.match('Opera') ? true : false,

				smartphone: ua.match('iphone') || ua.match('android') || ua.match('ipad') ? true : false,

				version: (ua.match(/.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/) || [])[1]

			};

		}())

		, listeners = {}

		, animations = []

		, query = location.hash && location.hash.replace('#', '')

		, _disableAnimate

		, exports;

	

	if (query) {

		query = query.split('_');

	}

	_disableAnimate = {

		'fade': (_userAgent.ie <= 8 || _userAgent.ps3 || _userAgent.smartphone || _userAgent.vita),

		'slideto': (_userAgent.ps3 || _userAgent.smartphone || _userAgent.vita),

		'scrolltop': (_userAgent.ps3 || _userAgent.smartphone || _userAgent.vita)

	};

	

	/* ------------------------------------------------------------

	* Private

	* ------------------------------------------------------------*/

	/**

	* 'on' + type時のqueue化

	*/

	function addListeners(target, type, func) {

		if (!listeners[type]) {

			listeners[type] = [{

				target: target,

				func: func

			}];

		} else {

			listeners[type].push({

				target: target,

				func: func

			});

		}

	}

	

	/**

	* 指定のアニメーションが登録済みかの真偽を取得

	* @param target {Object}

	* @param type {String}

	* @return {Boolean}

	*/

	function checkAnimate(target, type) {

		var i, len, animate;

		for (i = 0, len = animations.length; i < len; ++i) {

			animate = animations[i];

			if (animate && animate.target === target && animate.type === type) {

				return true;

			}

		}

		return false;

	}

	

	/**

	* 実行中のアニメーションを登録

	* @param target {Object}

	* @param type {String}

	* @param interval {Number} interval id

	*/

	function addAnimate(target, type, interval, options) {

		var i, len, animate;

		for (i = 0, len = animations.length; i < len; ++i) {

			animate = animations[i];

			if (animate && animate.target === target && animate.type === type) {

				return;

			}

		}

		animations[animations.length] = {

			target: target,

			type: type,

			options: options,

			interval: interval

		};

	}

	

	/**

	* 実行中のアニメーションから削除

	* @param target {Object}

	* @param type {String}

	*/

	function removeAnimate(target, type) {

		var i, len, animate;

		for (i = 0, len = animations.length; i < len; ++i) {

			animate = animations[i];

			if (animate && animate.target === target && animate.type === type) {

				animations[i] = null;

				animations.splice(i, 1)

			}

		}

	}

	

	/**

	* マウス座標の取得

	* @param evt {Object} EventObject

	* @return {Object} 座標オブジェクト

	*/

	function mouseCoords(evt){

		if(evt.pageX || evt.pageY){

			return {x:evt.pageX, y:evt.pageY};

		}

		return {

			x:evt.clientX + document.body.scrollLeft - document.body.clientLeft,

			y:evt.clientY + document.body.scrollTop - document.body.clientTop

		};

	}

	

	/**

	* ポジションの取得

	* @param target {Object}

	*/

	function getPosition(target) {

		var elm = target,

			left = 0,

			top = 0;

		

		while (elm.offsetParent){

			left += elm.offsetLeft;

			top += elm.offsetTop;

			elm = elm.offsetParent;

		}

		left += elm.offsetLeft || 0;

		top += elm.offsetTop || 0;

		

		return {x:left, y:top};

	}

	

	

	/* ------------------------------------------------------------

	* Exports

	* ------------------------------------------------------------*/

	exports = function() {};

	

	/**

	* ユーザーエージェントオブジェクトの取得

	* @method

	* @return {Object}

	*/

	exports.getUseragent = function() {

		return _userAgent;

	};

	

	/**

	* デバッグモードの真偽を取得

	*/

	exports.getDebug = function() {

		return DEBUG;

	};

	

	/**

	* アニメーション使用可否情報取得

	* @return {Object}

	*/

	exports.getDisableAnimate = function() {

		return _disableAnimate;

	};

	

	exports.setTestLink = function(selector) {

		var _alist = Sizzle(selector),

			_a,

			i, len = _alist.length,

			_domain;

		if (DEBUG) {

			for (i = 0; i < len; ++i) {

				_a = _alist[i];

				_domain = location.protocol + '//' + location.host;

				if (_a.href.match(_domain)) {

					_a.href = ROOT + (_a.href).replace(_domain, '');

				}

			}

		}

	};

	

	/**

	* ルートの取得

	* @return {String}

	*/

	exports.getRoot = function() {

		return ROOT;

	};

	

	/**

	* スクリプトファイル（モジュール）の読み込み

	* @param $script {String} スクリプトのパス

	* @param $callback {Function} コールバック関数

	*/

	exports.requireScript = function($script, $callback) {

		var _script = document.createElement('script');

		_script.type = "text/javascript";

		_script.onload = function() {

			if ($callback) {

				_script.onload = null;

				_script.onreadystatechange = null;

				$callback.apply(this);

			}

		};

		_script.onreadystatechange = function() {

			if (_script.readyState === 'loaded' || _script.readyState === 'complete') {

				if ($callback) {

					_script.onload = null;

					_script.onreadystatechange = null;

					$callback.apply(this);

				}

			}

		};

		_script.src = $script;

		Sizzle('head')[0].appendChild(_script);

	};

	

	/**

	* Query文字列の取得

	* @return {String}

	*/

	exports.getQuery = function() {

		return query;

	};

	

	/**

	* フォーマットオブジェクト（マスター）

	* @property {Object}

	*/

	exports.format = {

		TOP: _TOP,

		PS3: _PS3,

		VITA: _VITA,

		PSP: _PSP,

		current: null

	};

	

	/**

	* 現在のページフォーマットを設定

	* @method

	* @param id {String} 対象ページのbodytagID

	* @return {boolean} 該当以外のフォーマット時falseを返す

	*/

	exports.setCurrentFormat = function(id) {

		var i, len;

		for (i = 0, len = MASTER.length; i < len; ++i) {

			if (MASTER[i].name === id) {

				exports.format.current = MASTER[i].key;

				return true;

			}

		}

		return false;

	};

	

	/**

	* バナー用のボーダーを設定

	* @param bannerList {Array} <a></a><img>を包括した<li>のリスト

	*/

	exports.setBannerBorder = function(bannerList) {

		var banner, i, len;

		if (!bannerList) {

			return;

		}

		for (i = 0, len = bannerList.length; i < len; ++i) {

			banner = bannerList[i];

			exports.addEventListener(banner, 'mouseover', function(i) {

				return function() {

					var index = i,

						_a;

					_a = Sizzle('a', bannerList[index])[0];

					if (!_a) return;

					bannerList[index].style.cursor = 'pointer';

					_a.className = 'on';

				};

			}(i));

			exports.addEventListener(banner, 'mouseout', function(i) {

				return function() {

					var index = i,

						_a;

					_a = Sizzle('a', bannerList[index])[0];

					if (!_a) return;

					bannerList[index].style.cursor = 'default';

					_a.className = '';

				};

			}(i));

			exports.addEventListener(banner, 'click', function(i) {

				return function() {

					var index = i,

						_a;

					_a = Sizzle('a', bannerList[index])[0];

					if (!_a) return;

					if (_a.target === '_blank') {

						window.open(_a.href);

					} else {

						location.href = _a.href;

					}

				};

			}(i));

		}

	};

	

	/* ------------------------------------------------------------

	* Event

	* ------------------------------------------------------------*/

	/**

	* イベント登録

	* @method

	* @param target {Object} 対象のDOMObject

	* @param type {String} 登録するイベント

	* @param func {Function} 実行する関数

	*/

	exports.addEventListener = function(target, type, func) {

		var _targets, _target, i, len;

		if (!target) {

			return;

		}

		

		if (target.length) {

			_targets = target;

		} else {

			_targets = [target];

		}

		

		for (i = 0, len = _targets.length; i < len; ++i) {

			_target = _targets[i];

			if (_target.addEventListener) {

				_target.addEventListener(type, func, false);

			} else if (_target.attachEvent) {

				_target.attachEvent('on' + type, func);

			} else {

				addListeners(_target, type, func);

				_target['on' + type] = function() {

					var funcs = listeners[type], i, len = funcs.length;

					if (DEBUG) {

						alert(type + ' / funcs:' + len);

					}

					for (i = 0; i < len; ++i) {

						if (funcs[i].target === _target) {

							funcs[i].apply(target);

						}

					}

				};

			}

		}

	};

	

	/**

	* イベント登録解除

	* @method

	* @param target {Object} 対象のDOMObject

	* @param type {String} 登録するイベント

	* @param func {Function} 実行する関数

	*/

	exports.removeEventListener = function(target, type, func) {

		if (target.removeEventListener) {

			target.removeEventListener(type, func, false);

		} else if (target.detachEvent) {

			target.detachEvent('on' + type, func);

		} else {

			target['on' + type] = null;

		}

	};

	

	/**

	* デフォルトイベントをキャンセルする

	* @param evt {Object} イベントオブジェクト

	*/

	exports.cancelEvent = function(evt) {

		if (evt.preventDefault) {

			evt.preventDefault();

			evt.stopPropagation();

		} else {

			evt.cancelBubble = true;

			evt.returnValue = false;

		}

	};

	

	/* ------------------------------------------------------------

	* アニメーション

	* ------------------------------------------------------------*/

	/**

	* Windowスクロール

	* @param target {Object}

	* @param positions {Array}

	*/

	exports.scrollToTop = function(target, positions) {

		var c = Math.floor(800 / FRAME_RATE),

			interval,

			mwheel, afterWheel;

		

		if (_disableAnimate.scrolltop) {

			target.scrollTo(positions[0], positions[1]);

			return;

		}

		

		mwheel = _userAgent.firefox ? 'DOMMouseScroll' : 'mousewheel';

		interval = setInterval(function() {

			var _x = window.pageXOffset ? window.pageXOffset : (document.body.scrollLeft || document.documentElement.scrollLeft),

				_y = window.pageYOffset ? window.pageYOffset : (document.body.scrollTop || document.documentElement.scrollTop);

			

			target.scrollTo(_x - (_x - positions[0]) * .1, _y - (_y - positions[1]) * .1);

			--c;

			if ((_x - positions[0]) < 1 && (_y - positions[1]) < 1) {

				clearInterval(interval);

				target.scrollTo(positions[0], positions[1]);

				removeAnimate(target, 'scrolltop');

				exports.removeEventListener(window, mwheel, afterWheel);

			}

		}, FRAME_RATE);

		

		afterWheel = function() {

			exports.cancelAnimation(target, 'scrolltop');

			removeAnimate(target, 'scrolltop');

			exports.removeEventListener(window, mwheel, afterWheel);

			exports.removeEventListener(window, "keydow", afterWheel);

			exports.removeEventListener(document, mwheel, afterWheel);

			exports.removeEventListener(document, "keydow", afterWheel);

		};

		

		exports.addEventListener(window, mwheel, afterWheel);

		exports.addEventListener(window, "keydown", afterWheel);

		exports.addEventListener(document, mwheel, afterWheel);

		exports.addEventListener(document, "keydown", afterWheel);

		addAnimate(target, 'scrolltop', interval);

	};

	

	/**

	* スライド

	* @param target {Object}

	* @param positions {Array} 0: x, 1: y, 2: true ? ceil : floor

	* @param update {Function}

	* @param complete {Function}

	* @param speed {Number} Speed(Option)

	*/

	exports.slideTo = function(target, positions, update, complete, speed) {

		var c, interval,

			offsetX, offsetY,

			xfactor, yfactor,

			anim,

			_speed,

			_round,

			_x, _y,

			_frames = [];

		

		if (_disableAnimate.slideto) {

			target.style.left = positions[0] + 'px';

			target.style.top = positions[1] + 'px';

			if (complete) {

				complete.apply();

			}

			return;

		}

		

		c = Math.floor(2200 / FRAME_RATE);

		offsetX = target.style.left.replace('px', '');

		offsetY = target.style.top.replace('px', '');

		xfactor = (offsetX - positions[0]) / c;

		yfactor = (offsetY - positions[1]) / c;

		_speed = speed || .09;

		_round = positions[2] ? Math.ceil : Math.floor;

		

		anim = exports.getAnimation(target, 'slide');

		if (anim) {

			exports.cancelAnimation(target, 'slide');

			target.style.left = anim.options.position[0];

			target.style.top = anim.options.position[1];

		}

		

		_x = target.style.left.replace('px', '');

		_y = target.style.top.replace('px', '');

		function calcSlide() {

			var nx = _round(_x - (_x - positions[0]) * _speed),

				ny = _round(_y - (_y - positions[1]) * _speed);

			_frames[_frames.length] = [nx + 'px', ny + 'px'];

			_x = nx;

			_y = ny;

			if ((Math.abs(_x - positions[0]) < 1.4 && Math.abs(_y - positions[1]) < 1.4) || c === 0) {

				return false;

			}

			return true;

		}

		while(calcSlide()) {

			--c;

		}

		c = 0;

		interval = setInterval(function() {

			target.style.left = _frames[c][0];

			target.style.top = _frames[c][1];

			++c;

			if (update) {

				update.apply();

			}

			if (c === _frames.length) {

				clearInterval(interval);

				target.style.left = positions[0] + 'px';

				target.style.top = positions[1] + 'px';

				removeAnimate(target, 'slide');

				if (complete) {

					complete.apply();

				}

			}

		}, FRAME_RATE);

		addAnimate(target, 'slide', interval, {position: positions});

	};

	

	/**

	* フェードアウト

	* @method

	* @param target {Object} 対象DOMObject

	* @param duration {Number} 所要時間

	* @param callback {Function} コールバック関数

	* @param displaynone {Boolean} out完了時display: noneを設定するかの真偽

	*/

	exports.fadeOut = function(target, duration, callback, displaynone) {

		var c = Math.floor(duration / FRAME_RATE),

			op,

			interval,

			factor = 1 / c;

		

		if (displaynone === undefined) {

			displaynone = true;

		}

		if (!target || checkAnimate(target, 'fadeout') || target.style.opacity == '0') {

			return;

		}

		

		op = exports.getOpacity(target);

		if (!op) {

			op = 0;

		}

		exports.cancelAnimation(target, 'fadein');

		interval = setInterval(function() {

			op -= factor;

			exports.setOpacityTo(target, op);

			--c;

			if (c === 0) {

				clearInterval(interval);

				exports.setOpacityZero(target);

				if (displaynone) {

					target.style.display = 'none';

				}

				removeAnimate(target, 'fadeout');

				if (callback) callback.apply();

			}

		}, FRAME_RATE);

		addAnimate(target, 'fadeout', interval);

	};

	

	/**

	* フェードイン

	* @method

	* @param target {Object} 対象DOMObject

	* @param duration {Number} 所要時間

	* @param callback {Function} コールバック関数

	*/

	exports.fadeIn = function(target, duration, callback) {

		

		var c = Math.floor(duration / FRAME_RATE),

			interval,

			op = 0,

			factor = 1 / c;

		if (!target || target.style.opacity == '1' || checkAnimate(target, 'fadein')) {

			return;

		}

		exports.cancelAnimation(target, 'fadeout');

		target.style.display = 'block';

		target.style.visibility = 'visible';

		if (_disableAnimate.fade) {

			exports.setOpacityOne(target);

			target.style.display = 'block';

			if (callback) {

				callback.apply();

			}

			return;

		}

		interval = setInterval(function() {

			op += factor;

			exports.setOpacityTo(target, op);

			--c;

			

			if (c === 0) {

				exports.setOpacityOne(target);

				target.style.display = 'block';

				clearInterval(interval);

				removeAnimate(target, 'fadein');

				if (callback) callback.apply();

			}

			

		}, FRAME_RATE);

		addAnimate(target, 'fadein', interval);

	};

	

	/**

	* アニメーションをキャンセルする

	* @param target {Object} 対象

	* @param type {String} アニメーションタイプ 'fadein', 'fadeout'

	*/

	exports.cancelAnimation = function(target, type) {

		var i, len = animations.length, anim;

		

		for (i = 0; i < len; ++i) {

			anim = animations[i];

			if (anim.type === type && anim.target === target) {

				clearInterval(anim.interval);

				removeAnimate(target, type);

				return true;

			}

		}

		return false;

	};

	

	/**

	* 任意のアニメーションを取得する

	* @param target {Object} 対象

	* @param type {String} アニメーションタイプ 'fadein', 'fadeout' ...

	*/

	exports.getAnimation = function(target, type) {

		var i, len = animations.length, anim;

		for (i = 0; i < len; ++i) {

			anim = animations[i];

			if (anim.type === type && anim.target === target) {

				return anim;

			}

		}

		return null;

	};

	

	/**

	* 対象オブジェクトの透明度取得

	* @method

	* @param target {Object} 対象

	*/

	exports.getOpacity = function(target) {

		if (_userAgent.ie <= 8) {

			return target.style.filter.replace(/\D/mg, '') / 100;

		} else {

			return target.style.opacity;

		}

	};

	

	/**

	* 透明度を0にする

	* @param target {Object} ターゲットオブジェクト

	*/

	exports.setOpacityZero = function(target) {

		if (_userAgent.ie <= 8) {

			target.style.visibility = 'hidden';

		} else if (_disableAnimate.fade) {

			target.style.visibility = 'hidden';

			target.style.opacity = 0;

		} else {

			target.style.opacity = 0;

		}

	};

	

	/**

	* 透明度を1にする

	* @param target {Object} ターゲットオブジェクト

	*/

	exports.setOpacityOne = function(target) {

		if (_userAgent.ie <= 8) {

			target.style.visibility = 'visible';

		} else if (_disableAnimate.fade) {

			target.style.visibility = 'visible';

			target.style.opacity = 1;

		} else {

			target.style.opacity = 1;

		}

	};

	

	/**

	* 透明度を指定した値に変更する

	* @param target {Object} ターゲットオブジェクト

	* @param opacity {Number} 0-1 透明度

	*/

	exports.setOpacityTo = function(target, opacity) {

		if (!_disableAnimate.fade) {

			target.style.opacity = opacity;

		}

	};

	

	/**

	* ターゲットの子ノードを削除する

	* @param node {Element} 対象のノード

	*/

	exports.clearNode = function(node) {

		var i, len, childs = node.children;

		for (i = 0, len = childs.length; i < len; ++i) {

			node.removeChild(childs[0]);

		}

	};

	

	/**

	* groupリスト内DOMノードの高さを揃える

	* @method

	* @param group {Array} 

	*/

	exports.flatHeight = function(group) {

		var i, len, best = 0;

		for (i = 0, len = group.length; i < len; ++i) {

			if (group[i]) {

				group[i].style.height = '';

				best = Math.max(best, group[i].offsetHeight);

			}

		}

		for (i = 0; i < len; ++i) {

			if (group[i]) {

				group[i].style.height = best + 'px';

			}

		}

	};

	

	/* ------------------------------------------------------------

	* Mouse Event

	* ------------------------------------------------------------*/

	/**

	* 任意のエレメントにおけるマウス座標の取得

	* @param e {Object} targetElement

	* @param evt {Object} EventObject

	* @return {Object} 座標オブジェクト

	*/

	exports.getMouseOffset = function(e, evt){

			var ev = evt || window.event,

				ePos = getPosition(e),

				mousePos = mouseCoords(ev);

			return {x:mousePos.x - ePos.x, y:mousePos.y - ePos.y};

	};

	

	

	/**

	* ドラッグドロップ

	* @method

	* @param id_ {String} 対象エレメントのID

	* @param _max {Number} 最大移動座標

	*/

	exports.setDragDrop = function(id_, _max) {

		

		var dragDrop = {

			element: null,

			mouseOffset: null,

			minX: 0,

			maxX: _max,

			mouseCoords: function(evt){

				if(evt.pageX || evt.pageY){

					return {x:evt.pageX, y:evt.pageY};

				}

				return {

					x:evt.clientX + document.body.scrollLeft - document.body.clientLeft,

					y:evt.clientY + document.body.scrollTop  - document.body.clientTop

				};

			},

			getMouseOffset: function(e, evt){

				var ev = evt || window.event;

				var ePos = dragDrop.getPosition(e);

				var mousePos = dragDrop.mouseCoords(ev);

				return {x:mousePos.x - ePos.x, y:mousePos.y - ePos.y};

			},

			getPosition: function(e){

				var left = 0,

					top = 0;

				left += e.offsetLeft;

				top += e.offsetTop;

				return {x: left, y: top};

			},

			mouseMove: function(evt){

				var ev = evt || window.event,

					mousePos = dragDrop.mouseCoords(ev),

					e = dragDrop.element,

					_x;

				if(e){

					_x = mousePos.x - dragDrop.mouseOffset.x;

					_x = Math.max(0, Math.min(_x, dragDrop.maxX));

					e.style.left = _x + "px";

					return false;

				}

			},

			mouseUp: function(){

				dragDrop.element = null;

			},

			attach: function(e){

				if (!e) {

					return;

				}

				e.onmousedown = function(evt){

					dragDrop.element = this;

					dragDrop.mouseOffset = dragDrop.getMouseOffset(this, evt);

					return false;

				}

			}

		};

		

		dragDrop.attach(Sizzle('#' + id_)[0]);

		return dragDrop;

	};

	

	/* ------------------------------------------------------------

	* Cookie

	* ------------------------------------------------------------*/

	

	/**

	* Cookieの取得

	* @param key {String}

	* @return {String} value

	*/

	exports.getCookie = function(key) {

		var tmp1, tmp2, len,

			xx1, xx2, xx3;

		

		xx1 = xx2 = 0;

		tmp1 = ' ' + document.cookie + ';';

		len = tmp1.length;

		while (xx1 < len) {

			xx2 = tmp1.indexOf(';', xx1);

			tmp2 = tmp1.substring(xx1 + 1, xx2);

			xx3 = tmp2.indexOf('=');

			if (tmp2.substring(0, xx3) == key) {

				return (unescape(tmp2.substring(xx3 + 1, xx2 - xx1 - 1)));

			}

			xx1 = xx2 + 1;

		}

		return '';

	};

	

	/**

	* Cookieの設定

	* @param key {String}

	* @param value {String, Number}

	* @param once {Boolean}

	*/

	exports.setCookie = function(key, val, once) {

		var tmp;

		tmp = key + '=' + escape(val) + '; ';

		if (!once) {

			tmp += 'expires=Tue, 31-Dec-2030 23:59:59; ';

		}

		document.cookie = tmp;

	};

	

	/* ------------------------------------------------------------

	* Ajax

	* ------------------------------------------------------------*/

	/**

	* JSONデータ読み込み・取得

	* @param url {String} 読み込みJSON URL

	* @param callback {Function} コールバック関数

	* @param error {Function} エラー処理関数

	*/

	exports.getJSON = function(url, callback, error) {

		var xhReq = createXMLHttpRequest(),

			requestTimer = setTimeout(function() {

				xhReq.abort();

			}, 10000);

		xhReq.open("GET", url, true);

		xhReq.setRequestHeader('Content-Type', 'applicaton/json; charset=utf-8');

		xhReq.onreadystatechange = function() {

			if (xhReq.readyState != 4) {

				return

			}

			clearTimeout(requestTimer);

			if (xhReq.status != 200) {

				if (error) {

					error.apply(this, [{

						message: 'budRequest:' + xhReq.status

					}]);

				}

				return;

			}

			var serverResponse = xhReq.responseText;

			callback.apply(this, [serverResponse]);

			

		};

		xhReq.send(null);

		function createXMLHttpRequest() {

			try {

				return new XMLHttpRequest();

			} catch (e) {

				

			}

			try {

				return new ActiveXObject("Msxml2.XMLHTTP");

			} catch (e) {

				

			}

			try {

				return new ActiveXObject("Microsoft.XMLHTTP");

			} catch (e) {

				

			}

			return null;

		}

	};

	/* ------------------------------------------------------------

	* Array

	* ------------------------------------------------------------*/

	/**

	* getUniqueArray

	* @param array {Array}

	* @return {Array} Unique Array

	*/

	exports.arrayUnique = function(array) {

		var newArray = array.concat(),

			length = newArray.length,

			i, j;

		for (i = 0; i < length; i += 1) {

			for(j = 0; j < length; j += 1) {

				if (newArray[i] === newArray[j]) {

					newArray.splice(j, 1);

				}

			}

		}

		return newArray;

	};

	

	exports.arrayGC = function(array) {

		var i, len = array.length,

			result = [];

		for (i = 0; i < len; ++i) {

			if (array[i] !== undefined && array[i] !== null) {

				result[result.length] = array[i];

			}

		}

		return result;

	};



	/* ------------------------------------------------------------

	* Helper

	* ------------------------------------------------------------*/

	/**

	 * クラス名を追加する

	 * @param element {Element Object} 対象エレメント

	 * @param name {String} クラス名

	 */

	exports.addClassName = function(element, name) {

		if (element.className.search(name) === -1) {

			if (element.className) {

				element.className += ' ' + name;

			} else {

				element.className = name;

			}

		}

	};



	/**

	 * クラス名を削除する

	 * @param element {Element Object} 対象エレメント

	 * @param name {String} クラス名

	 */

	exports.removeClassName = function(element, name) {

		element.className = element.className.replace(name, '');

		if (element.className.search(name) !== -1) {

			exports.removeClassName(element, name);

		} else {

			if (element.className.search(/\s{2}/) !== -1) {

				element.className = element.className.replace(/\s{2}/, '');

			}

		}

	};



	/**

	 * 実態参照に変換する

	 * @param str {String}

	 * @return {String}

	 */

	exports.escapeHTML = function(str) {

		str = str.replace(/&/g, '&amp;');

		str = str.replace(/"/g, '&quot;');

		str = str.replace(/'/g, '&#039;');

		str = str.replace(/</g, '&lt;');

		str = str.replace(/>/g, '&gt;');

		return str;

	};

	return exports;

}());

/**

* 共有実行

* @namespace SCE_APP

* @class Common

*/

SCE_APP.Common = (function() {

	var _util = SCE_APP.Utility;

	_util.addEventListener(window, 'load', function() {

		var util = _util,

			ua = util.getUseragent();

		

		//Current

		util.setCurrentFormat(Sizzle('body')[0].id);

		

		//Return To Top Button

		function setupReturnToTop() {

			var returnToTop;

			returnToTop = document.getElementById('return-to-top-button');

			

			util.addEventListener(window, 'scroll', function() {

				var offset = window.pageYOffset ? window.pageYOffset : (document.body.scrollTop || document.documentElement.scrollTop);

				if (offset < 100) {

					util.fadeOut(returnToTop, 400);

				} else {

					util.fadeIn(returnToTop, 400);

				}

			});

			util.addEventListener(returnToTop, 'click', function() {

				var offset = window.pageYOffset ? window.pageYOffset : (document.body.scrollTop || document.documentElement.scrollTop);

				if (offset !== 0) {

					util.scrollToTop(window, [0, 0]);

				}

			});

			

			if (ua.ps3) {

				document.getElementById('return-to-top-button').style.opacity = 1;

				document.getElementById('return-to-top-button').style.visibility = 'visible';

			}

			

		}

		setupReturnToTop();

		

		/**

		* コンテンツ内部 ゲームタイトル検索のセットアップ

		*/

		function setupSearchBox() {

			var txt = document.getElementById('search-query'),

				submitbutton = document.getElementById('search-submit'),

				defaultTxt = 'お探しのゲームに関するキーワードを入力してください。';

			

			if (!txt || !submitbutton) {

				return;

			}

			util.addEventListener(txt, 'focus', function() {

				if (txt.value === defaultTxt) {

					txt.value = '';

				}

			});

			util.addEventListener(txt, 'blur', function() {

				if (txt.value === '' || txt.value.match(/\s+/)) {

					txt.value = defaultTxt;

				}

			});

			util.addEventListener(submitbutton, 'click', function() {

				if (txt.value === defaultTxt) {

					txt.value = '';

				}

				txt.value = util.escapeHTML(txt.value);

				return false;

			});

			

			util.addEventListener(Sizzle('#menu-search-submit')[0], 'click', function() {

				var globalsearch = document.getElementById('menu-search-query');

				globalsearch.value = util.escapeHTML(globalsearch.value);

			});

		}

		setupSearchBox();

		

		/**

		* Contents Banner ・ Bottom Banner

		*/

		if (ua.ie) {

			util.setBannerBorder(Sizzle('#bottom-banners li'));

			util.setBannerBorder(Sizzle('#content-banner-wrapper li'));

		}

		

		/**

		* Open window for Regacy code on Global

		*/

		if (__global) {

			__global.openWindow = function(url, w, h) {

				window.open(url, "SCEPopupWindow", "width=" + (w || 400) + ",height=" + (h || 300));

			};

		}

		

		window.mboxOnClick = function(myMbox, clickedOnValue, myLocation, target) {

			if (target === '_blank') {

				window.open(myLocation);

			} else {

				setTimeout(function(){

					location.href = myLocation;

				},500);

			}

			mboxUpdate(myMbox, 'clickedOn=' + clickedOnValue);

		};



	});

}());



/**

* SCE_APP

* @module sceApp

* dependence on Sizzle.js

*/



var SCE_APP = SCE_APP || {};



/**

* @namespace SCE_APP

* @class ImageBox

*/

SCE_APP.ImageBox = (function() {

	/* ------------------------------------------------------------

	* private static

	* ------------------------------------------------------------*/

	var imageDatas = [],

		target,

		win,

		overlay,

		current,

		util = SCE_APP.Utility,

		LOAD_IMAGE = "/common/img/ico_loading.png";

	

	/* ------------------------------------------------------------

	* private Method

	* ------------------------------------------------------------*/

	

	function createThickbox() {

		if (!overlay) {

			overlay = createOverlay();

			target.appendChild(overlay);

		}

		if (!win) {

			createWindow();

		}

	}

	

	/**

	* window作成

	* @return {Element}

	*/

	function createWindow() {

		var anchor,

			img,

			loading, loaderwrap,

			caption,

			closebutton, closeTxt,

			second,

			obj = imageDatas[current];

		

		win = document.createElement('div');

		win.id = "TB_window";

		win.style.marginLeft = '-335px';

		win.style.width = '670px';

		win.style.marginTop = '-210px';

		win.style.display = 'block';

		anchor = document.createElement('a');

		anchor.href = "";

		anchor.id = "TB_ImageOff";

		anchor.title = "Close";

		

		loaderwrap = document.createElement('div');

		loaderwrap.id = 'TB_load';

		loaderwrap.style.display = 'block !important';

		loading = new Image();

		loading.src = LOAD_IMAGE;

		loaderwrap.appendChild(loading);

		

		img = new Image();

		

		img.onload = function() {

			target.removeChild(loaderwrap);

			target.appendChild(win);

			img.onload = null;

		};

		

		img.id = "TB_Image";

		img.src = obj.src;

		img.alt = obj.title;

		anchor.appendChild(img);

		

		caption = document.createElement('div');

		caption.id = 'TB_caption';

		caption.appendChild(document.createTextNode(obj.title));

		second = createSecond(obj);

		caption.appendChild(second);

		

		closebutton = document.createElement('div');

		closebutton.id = 'TB_closeWindow';

		closeTxt = document.createElement('a');

		closeTxt.href = "javascript:void(0);";

		closeTxt.id = 'TB_closeWindowButton';

		closeTxt.title = 'Close';

		closeTxt.appendChild(document.createTextNode('閉じる'));

		closeTxt.onclick = exports.close;

		closebutton.appendChild(closeTxt);

		

		win.appendChild(anchor);

		win.appendChild(caption);

		win.appendChild(closebutton);

		target.appendChild(loaderwrap);

		return win;

	}

	function removeWindow() {

		if (win) {

			try {

				target.removeChild(win);

			} catch(e) {

				

			}

			win = null;

		}

	}

	function onNext() {

		++current;

		removeWindow();

		createThickbox();

	}

	

	function onPrev() {

		--current;

		removeWindow();

		createThickbox();

	}

	

	/**

	* Next Prev 部作成

	* @param obj {Object} imageDataObject

	* @return {Element}

	*/

	function createSecond(obj) {

		var a, second,

			prev, next,

			count;

		second = document.createElement('div');

		second.id = 'TB_secondLine';

		if (obj.index !== 0) {

			prev = document.createElement('span');

			prev.id = 'TB_prev';

			a = document.createElement('a');

			a.href = 'javascript:void(0);';

			a.appendChild(document.createTextNode('< 前'));

			a.onclick = onPrev;

			prev.appendChild(a);

			prev.appendChild(document.createTextNode('　'));

			second.appendChild(prev);

		}

		

		count = document.createElement('span');

		count.id = 'TB_Count';

		count.appendChild(document.createTextNode((current + 1) + '/' + imageDatas.length));

		

		second.appendChild(count);

		if (obj.index !== imageDatas.length - 1) {

			next = document.createElement('span');

			next.id = 'TB_next';

			a = document.createElement('a');

			a.href = 'javascript:void(0);';

			a.onclick = onNext;

			a.appendChild(document.createTextNode('次 >'));

			next.appendChild(document.createTextNode('　'));

			next.appendChild(a);

			second.appendChild(next);

		}

		return second;

	}

	

	/**

	* 黒オーバーレイ作成

	* @return {Element}

	*/

	function createOverlay() {

		var result = document.createElement('div');

		result.id = 'TB_overlay';

		result.className = 'TB_overlayBG';

		result.onclick = exports.close;

		return result;

	}

	function removeOverlay() {

		if (overlay) {

			target.removeChild(overlay);

			overlay.onclick = null;

			overlay = null;

		}

	}

	

	/* ------------------------------------------------------------

	* Exports

	* ------------------------------------------------------------*/

	var exports = function() {

		

	};

	

	exports.init = function() {

		var thumblist,

			thumb,

			obj,

			i, len;

		

		target = Sizzle('body')[0];

		thumblist = Sizzle('.thickbox');

		len = thumblist.length;

		

		for (i = 0; i < len; ++i) {

			thumb = thumblist[i];

			obj = {

				'src': thumb.href,

				'title': thumb.title,

				'group': thumb.rel,

				'index': i

			};

			imageDatas[imageDatas.length] = obj;

			thumb.onclick = (function(_index) {

				return function() {

					var index = _index;

					current = index;

					createThickbox();

					return false;

				}

			})(i);

		}

	};

	

	exports.close = function() {

		removeWindow();

		removeOverlay();

	};

	

	exports.destroy = function() {

		removeWindow();

		removeOverlay();

		imageDatas = null;

		target = null;

		util = null;

	};

	

	util.addEventListener(window, 'load', function() {

		if (util.getUseragent().ps3) {

			$('.thickbox').unbind('click');

			exports.init();

		}

	});

	

	return exports;

}());



/**

* SCE_APP

* @module sceApp

* dependence on Sizzle.js

*/



var SCE_APP = SCE_APP || {};



/**

* @namespace SCE_APP

* @class GlobalMenu

*/

SCE_APP.GlobalMuen = (function() {

	/* ------------------------------------------------------------

	* private static

	* ------------------------------------------------------------*/

	var _menus = [],

		_isInit = false;

	

	/* ------------------------------------------------------------

	* private Method

	* ------------------------------------------------------------*/

	/**

	* 指定のオブジェクトを覗いたサブメニューの非表示

	* @param without {Object} 非表示させないDOMオブジェクト

	*/

	function hideSubMenuWithout(without) {

		var i, len, node;

		for (i = 0, len = _menus.length; i < len; ++i) {

			node = _menus[i];

			if (node.subMenu) {

				if (without && node.menu.id === without.id) {

					node.a.className = 'on';

					node.subMenu.style.display = 'block';

				} else {

					node.a.className = '';

					node.subMenu.style.display = 'none';

				}

			}

		}

	}

	

	/**

	* メニュー作成

	*/

	function createMenu() {

		var list = ['menu-home', 'menu-ps3', 'menu-vita', 'menu-psp', 'menu-psn', 'menu-psc', 'menu-search'],

			subList = ['', 'sub-menu-ps3', 'sub-menu-vita', 'sub-menu-psp', 'sub-menu-psn', 'sub-menu-psc', ''],

			i,

			len,

			menu, submenu,

			util = SCE_APP.Utility;

			

		for (i = 0, len = list.length; i < len; ++i) {

			menu = document.getElementById(list[i]);

			submenu = document.getElementById(subList[i]) || null;

			_menus[_menus.length] = {

				menu: menu,

				a: Sizzle('a:first', menu)[0],

				subMenu: submenu

			};

			

			util.addEventListener(menu, 'mouseover', function(_i) {

				return function(e) {

					hideSubMenuWithout(_menus[_i].menu);

				};

			}(i));

			

			util.addEventListener(menu, 'mouseout', function() {

				hideSubMenuWithout();

			});

		}

	}

	

	/**
	* メニュー部検索BOXセットアップ
	*/

	function setupMenuSearch() {
		var searchButton,
			searchArea,
			searchRadioSite,
			searchRadioSoft,
			searchCheckQA,
			searchWrap,
			siteLabel,
			softLabel,
			qaLabel,
			searchGroup,
			searchRight, _isSearch = false;

		searchButton = document.getElementById('menu-search-button');
		searchArea = document.getElementById('sub-menu-search');
		searchRadioSoft = document.getElementById('menu-search-soft');
		searchRadioSite = document.getElementById('menu-search-site');
		searchCheckQA = document.getElementById('menu-search-qa');
		searchWrap = document.getElementById('menu-search-wrap');
		searchRight = document.getElementById('menu-search-right');
		siteLabel = document.getElementById('menu-search-site-label');
		softLabel = document.getElementById('menu-search-soft-label');
		qaLabel = document.getElementById('menu-search-qa-label');
		searchGroup = document.getElementById('menu-search-group'); 

		/**
		 * サイト内検索クリック時
		 */

		util.addEventListener([siteLabel, searchRadioSite], 'click', function() {
			setTimeout(function() {
				siteLabelClicked();
			}, 200);
		});


		function siteLabelClicked() {
			searchCheckQA.disabled = false;
			searchGroup.value = 0;
			util.addClassName(siteLabel, 'on');
			util.removeClassName(softLabel, 'on');
			util.removeClassName(qaLabel, 'qadisable');
		}


		/**
		 * ゲームタイトル検索クリック時
		 */

		util.addEventListener([searchRight, searchRadioSoft], 'mouseup', function() {
			setTimeout(function() {
				searchCheckQA.checked = false;
				searchCheckQA.disabled = true;
				searchGroup.value = 1;
				util.removeClassName(qaLabel, 'qaon');
				util.removeClassName(qaLabel, 'qaoff');
				util.addClassName(qaLabel, 'qadisable');
				util.addClassName(softLabel, 'on');
				util.removeClassName(siteLabel, 'on');
			}, 100);
		});


		/**
		 * QAチェンジ時
		 */

		util.addEventListener([qaLabel, searchCheckQA], 'click', function() {
			if (softLabel.className) {
				siteLabelClicked();
				searchRadioSite.select();
				searchRadioSite.checked = true;
			}
			setTimeout(function() {
				changeQAcheck();
			}, 200);
		});


		function changeQAcheck() {
			var checked = searchCheckQA.checked;
			if (checked) {
				util.removeClassName(qaLabel, 'qaoff');
				util.addClassName(qaLabel, 'qaon');
			} else {
				util.addClassName(qaLabel, 'qaoff');
				util.removeClassName(qaLabel, 'qaon');
			}
		}
		changeQAcheck();
		

		util.addEventListener(searchButton, 'click', function() {
			var searchbox = document.getElementById('sub-menu-search'),
				onDocumentClicked, onSearchClicked;
				
			if (!_isSearch) {
				searchButton.className = 'on';
				util.setOpacityZero(searchArea);
				util.fadeIn(searchArea, 100);
				
				onDocumentClicked = function() {
					if (_isSearch) {
						searchButton.className = '';
						_isSearch = false;
						util.fadeOut(searchArea, 100);
						util.removeEventListener(searchbox, 'click', onSearchClicked);
						util.removeEventListener(document, 'click', onDocumentClicked);
					}
				};
				
				onSearchClicked = function() {
					_isSearch = false;
					setTimeout(function() {
						_isSearch = true;
					}, 100);
				};
				
				setTimeout(function() {
					util.addEventListener(document, 'click', onDocumentClicked);
					util.addEventListener(searchbox, 'click', onSearchClicked);
				}, 200);
				_isSearch = true;
			}
		});
	}
	
	/* ------------------------------------------------------------

	* Exports

	* ------------------------------------------------------------*/

	var exports = function() {}

		, util = SCE_APP.Utility;

	

	/**

	* 初期化

	* @method

	*/

	exports.init = function() {

		if (_isInit) {

			return;

		}

		createMenu();

		setupMenuSearch();

		_isInit = true;

	};

	

	util.addEventListener(window, 'load', function() {

		exports.init();

	});

	return exports;

}());

